似乎WindowsFormsHost控件设置为显示在顶部。是否有任何方法可以更改其z顺序以允许同一窗口上的其他WPF控件在WindowsFormsHost控件上显示?
答案 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
上。只需将另一个WindowsFormsHost
与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>
Button
的当前剪辑区域为ElementHost
,WinForms
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>