WindowsFormsHost ZOrder

时间:2010-08-24 11:49:03

标签: wpf z-order

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

2 个答案:

答案 0 :(得分:6)

不幸的是,由于winformshost被合成到WPF窗口的方式,它必须出现在顶部。

请参阅here中的z顺序段落。

  

在WPF用户界面中,您可以将元素的z顺序更改为   控制重叠行为。绘制托管的Windows窗体控件   在一个单独的HWND中,所以它总是在WPF元素之上绘制。

     

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

答案 1 :(得分: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个边界将超出ScrollViewer个边界。但是,有一种方法可以创建“中间” HWND项,以将WinForms区域裁剪到ScrollViewer上。只需将另一个WindowsFormsHostElementHost放置如下:

<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>

Button的当前剪辑区域为ElementHostWinForms Button的滚动区域将在滚动时被其剪辑。另外,您可以为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>