中添加两个动态库dll,一个是.NET库中的System.Windows.Forms,另外一个是WindowsFormsIntegration; 2、添加完两个动态dll以后,就可以在控件库中找到WindowsFormsHost 这个控件; 3、将这个控件放入窗体,放置完以后在xmal代码中会自动生成相应代码: <Grid> <WindowsFormsHost Height="100" HorizontalAlignment ="Left" Margin="36,29,0,0" Name="windowsFormsHost1" VerticalAlignment="Top" Width="200" /> </Grid> <WindowsFormsHost Height="196" HorizontalAlignment="Left" Margin="104,65,0,0" Name="windowsFormsHost1 > <wfi:WindowsFormsHost Grid.Row="1" Grid.Column="1"> <wf:PictureBox x:Name="thz2
3、 在WPF的容器控件内如StackPanel内首先要添加WinForm控件的宿主容器,用于衔接WPF和WinForm, 对应XAML如下: 说明:<wfi:WindowsFormsHost></wfi :WindowsFormsHost>即为WinForm控件的宿主容器,每一个宿主容器只能放一个WinForm控件,如下例,放了三个WinForm控件,分别放在三个宿主容器里面,该容器可以设置属性来调整大小和布局 <StackPanel> <wfi:WindowsFormsHost> <local:UserControl1 Name="Header" Width="319" Height="30">< /local:UserControl1> </wfi:WindowsFormsHost> <wfi:WindowsFormsHost> <wf:Label x:Name="wfLabel " Text="winForm控件在此" /> </wfi:WindowsFormsHost> </StackPanel> 4、 如果要在WPF后台代码中访问上面的Lable,可直接像在WinForm
xml <WindowsFormsHost Name="FormsHost"> <winform:WebBrowser> </WindowsFormsHost> 三、WindowFormsHost clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed> </xmlns> 在xaml中使用AirspaceDecorator包裹WindowsFormsHost AirspaceDecorator AirspaceMode="Redirect" IsInputRedirectionEnabled="True" IsOutputRedirectionEnabled="True"> <WindowsFormsHost Name="FormsHost"> <winform:WebBrowser> </WindowsFormsHost> </airspace:AirspaceDecorator>
我们先看一个示例:通过微软原生态控件在WPF中使用Winform,代码如下: <wfi:WindowsFormsHost> <wf:DataGridView x:Name="Dg" Dock ="Fill" SelectionMode="FullRowSelect"> </wf:DataGridView> </wfi:WindowsFormsHost > WindowsFormsHost其实是Winform在WPF的容器,所以Winform的控件显示都要在这个容器里面。 ="clr-namespace:C1.Win.FlexViewer;assembly=C1.Win.FlexViewer.4" 在布局中添加可供报表预览的控件 <Grid> <wfi:WindowsFormsHost <cc11:C1FlexViewerPane x:Name="flexViewerPane" ></cc11:C1FlexViewerPane> </wfi:WindowsFormsHost
<ColumnDefinition/> </Grid.ColumnDefinitions> <WindowsFormsHost 0,0,4,0"> <vtk:RenderWindowControl x:Name="VtkFormControl1"/> </WindowsFormsHost > <WindowsFormsHost Grid.Column="1" Margin="4,0,0,0"> <vtk:RenderWindowControl x:Name="VtkFormControl2"/> </WindowsFormsHost> </Grid> </Grid>
RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <WindowsFormsHost Grid.Row="1"> <vtksharp:RenderWindowControl x:Name="vtkFormControl1"/> </WindowsFormsHost
=WindowsFormsIntegration" Title="MainWindow" Height="350" Width="525"> <Grid> <wfi:WindowsFormsHost > <wf:ListBox x:Name="listBox" Width="200" Height="200" /> </wfi:WindowsFormsHost> </Window>在上面的示例中,我们首先在XAML文件中添加了System.Windows.Forms和System.Windows.Forms.Integration命名空间的引用,然后创建了一个WindowsFormsHost assembly=System.Windows.Forms" Title="MainWindow" Height="350" Width="525"> <Grid> <WindowsFormsHost
因为WebBrowser控件是个Windows Form控件,WPF窗体不能直接运行WinForm控件,然后在WPF窗体上添加WindowsFormsHost控件,此WindowsFormsHost控件可作为 控件命名空间, xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" <Grid> <WindowsFormsHost DocumentCompleted="webBrowser_DocumentCompleted" SizeChanged="webBrowser_SizeChanged"></wf:WebBrowser> </WindowsFormsHost
> </Button.Content> </Button> </Grid> <WindowsFormsHost Grid.Row="1"> <vtk:RenderWindowControl x:Name="VtkFormControl1"/> </WindowsFormsHost
HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="LightCyan"/> <wfi:WindowsFormsHost " Grid.Column="0" Background="LightGray"> <wf:PictureBox x:Name="Cam1" /> </wfi:WindowsFormsHost HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="LightCyan"/> <wfi:WindowsFormsHost " Grid.Column="0" Background="LightGray"> <wf:PictureBox x:Name="Cam2" /> </wfi:WindowsFormsHost
MyWpfControl();elementHost.Child = wpfControl;this.Controls.Add(elementHost);```**WPF宿主Winform**:通过WindowsFormsHost 在WPF中嵌入Winform控件,复用已有组件:```xml<WindowsFormsHost> <wf:Chart x:Name="winformsChart"/></WindowsFormsHost
video_frame.plane0_, (UInt32)argb_size); }另外一种,可以用picturebox,在MainWindow.xaml 做以下设置: <WindowsFormsHost ="480" Background="Black"> <wf:PictureBox x:Name="RealPlayWnd"></wf:PictureBox> </WindowsFormsHost
技术实现以大牛直播SDK的Windows平台SmartPlayer为例,我们先说第一种通过控件模式,控件模式,非常简单:可以用picturebox,在MainWindow.xaml 做以下设置: <WindowsFormsHost ="480" Background="Black"> <wf:PictureBox x:Name="RealPlayWnd"></wf:PictureBox> </WindowsFormsHost
在WPF中显示Win32控件, 可以使用HwndHost, 而对于WinForms, 可以使用WindowsFormsHost.
后者使用的是 Win32 的方式,实际效果非常类似 WindowsFormsHost,新线程中的 UI 在原来的所有 WPF 控件上面遮挡。另外,后者不止可以是跨线程,还可以跨进程。
后者使用的是 Win32 的方式,实际效果非常类似 WindowsFormsHost,新线程中的 UI 在原来的所有 WPF 控件上面遮挡。另外,后者不止可以是跨线程,还可以跨进程。
如此也能解答一些伙伴的疑惑,那就是 MAUI 接入 WPF 的话,能作为控件的形式接入,而不作为类似 WindowsFormsHost 的方式接入。
类似于WPF中的WindowsFormsHost,但与之不同的是,Avalonia UI 还使用 3D 元素解决了“空域问题”,可以直接在各种表面上绘制 UI。
鉴于CefSharp.WinForms和CefSharp.WPF接口相似,作者建议在WPF项目中使用WindowsFormsHost承载CefSharp.WinForms来解决中文输入法问题,并欢迎更好的解决方案分享
您也可以托管WinFormsWPF使用中的版本号WindowsFormsHost,可能需要绕过该WPF版本的某些限制(CEF尚未在OSR模式中实现完全的触摸屏支持,在上存在一个开放问题CEF Issue