6

似乎 WindowsFormsHost 控件设置为显示在顶部。有什么方法可以更改其 z 顺序以允许同一窗口上的其他 WPF 控件在 WindowsFormsHost 控件的顶部可见?

4

2 回答 2

7

不幸的是,没有,因为 winformshost 被合成到 WPF 窗口中的方式,它必须出现在顶部。

请参阅此处的 z 顺序段落。

在 WPF 用户界面中,您可以更改元素的 z 顺序以控制重叠行为。托管的 Windows 窗体控件在单独的 HWND 中绘制,因此它始终绘制在 WPF 元素之上。

托管的 Windows 窗体控件也绘制在任何 Adorner 元素之上。

于 2010-08-24T11:51:49.400 回答
0

你可以做一个小技巧。当您声明一个WindowsFormsHost时,它的父级是第一个 HWND 组件。通常它是根窗口。因此,控件的剪辑区域是整个窗口。我将展示一个 WPF 示例ScrollViewer

<Window>
    <Grid>
        <ScrollViewer Margin="20,50">
            <ItemsControl ItemsSource="{StaticResource StringArray}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <WindowsFormsHost>
                            <wf:Button />
                        </WindowsFormsHost>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </Grid>
</Window>

在这种情况下Button, s 将超出ScrollViewer范围。但是有一种方法可以创建“中间”HWND 项目来剪辑WinForms区域ScrollViewerWindowsFormsHost只需ElementHost像下面这样放置另一个:

<Grid>
    <WindowsFormsHost Margin="20,50">
        <ElementHost x:Name="This is a clip container">
            <ScrollViewer>
                <ItemsControl ItemsSource="{StaticResource StringArray}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <WindowsFormsHost>
                                <wf:Button />
                            </WindowsFormsHost>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </ScrollViewer>
        </ElementHost>
    </WindowsFormsHost>
</Grid>

现在 s 的剪辑区域ButtonElementHost并且WinForms Buttons 将在滚动时被它剪辑。ControlTemplate您也可以在需要的地方创建ContentContol和重用它。

<ControlTemplate x:Key="ClipContainer" TargetType="{x:Type ContentControl}">
    <WindowsFormsHost>
        <ElementHost>
            <ContentPresenter />
        </ElementHost>
    </WindowsFormsHost>
</ControlTemplate>
<Grid>
    <ContentControl Template="{StaticResource ClipContainer}" Margin="20,50">
        <ScrollViewer>
            <ItemsControl ItemsSource="{StaticResource StringArray}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <WindowsFormsHost>
                            <wf:Button />
                        </WindowsFormsHost>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </ContentControl>
</Grid>
于 2020-04-04T14:56:47.347 回答