WPF嵌入Winform控件置顶问题

WPF嵌入Winform控件置顶问题

1. 引言

在使用WPF开发监控软件时,通常要使用相机软件自带的官方SDK,但是大多数SDK通过控件句柄进行图像显示,比较常见的包括海康威视以及微视的多款相机。但是WPF控件都是使用像素进行绘制,不存在控件句柄,即使获得的句柄也只是整个窗体的句柄。鉴于微软官方提供的WindowsFormHost能够将Winform控件引入WPF中,故通过此方式我们能够实现在WPF中使用winfrom控件的句柄。但是由于WPF使用DiretcX进行渲染,而Winfrom使用GDI进行渲染,由于GDI的渲染慢于DirectX,故显示出的软件界面,Winfrom控件始终处于最上层。

2. 问题分析

当我们需要在显示的视频上绘制某些遮盖或者实现某些透明功能时,鉴于wpf与winform渲染机制的差异,使用常规Panel.Zindex设置控件非层,注定失败。目前唯一的解决方式是借助第三方库,包裹住winrom控件。

3. 解决方案

为了解决winform控件置顶问题,需要把以下两个库引入项目中,并且在对应的winfrom控件上加上如下语句
3.1 引入命名控件:
dll下载地址:https://download.csdn.net/download/aniston_luo/16754486
xmlns:airspace="clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed"

3.2 包裹winform控件

    <airspace:AirspaceDecorator AirspaceMode="Redirect" 
                                    Name="myCam"
                                    IsInputRedirectionEnabled="True" 
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
                                    IsOutputRedirectionEnabled="True">
            <WindowsFormsHost
        MouseWheel="OnMouseWheelAdjustCam"
            Name="pictureHost" Background="Transparent" 
                               Visibility="Visible" 
                               VerticalAlignment="Stretch">
                <wf:PictureBox x:Name="PictureBoxDisplay" ></wf:PictureBox>
            </WindowsFormsHost>

        </airspace:AirspaceDecorator>

4. 总结

由于WPF与winform控件的兼容问题,故建议非必要情况下不使用WPF嵌入winform作为方案。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WPF中调用WinForm控件是通过将WinForm控件嵌入WPF内容中实现的。首先,需要在WPF项目中引用`WindowsFormsIntegration`命名空间。 1. 创建WinForm控件:在WinForm项目中创建所需的WinForm控件,例如一个Windows.Forms.Button。 2. 在WPF中添加WindowsFormsHost控件:在WPF的XAML文件中,添加一个WindowsFormsHost控件。 ```xaml <Grid> <WindowsFormsHost Name="windowsFormsHost1" /> </Grid> ``` 3. 将WinForm控件添加到WindowsFormsHost控件中:在WPF的代码文件中,在相关的事件处理程序或页面加载完成等事件中,将WinForm控件添加到WindowsFormsHost控件中。 ```csharp private void Window_Loaded(object sender, RoutedEventArgs e) { System.Windows.Forms.Button winFormButton = new System.Windows.Forms.Button(); windowsFormsHost1.Child = winFormButton; } ``` 通过以上步骤,就可以将WinForm控件嵌入WPF中了。需要注意的是,由于WPFWinForm使用了不同的UI渲染技术,嵌入WinForm控件的外观可能会与周围的WPF控件不完全一致,需要进行一些样式调整来保持一致性。 同时,还可以通过WPF的命令模型和事件模型与嵌入WinForm控件进行交互。例如,可以通过WPF的命令绑定和事件处理程序来响应WinForm控件的点击事件,实现业务逻辑的处理。 总而言之,通过WindowsFormsHost控件可以在WPF嵌入WinForm控件,并通过WPF的命令和事件模型来与其进行交互,提供更丰富的用户界面和功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值