马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在将WPF升级到Avalonia时,可能很多开发者风俗利用WPF的WindowsFormsHost来嵌入WinForms组件。Avalonia虽然没有WindowsFormsHost,但提供了功能类似的NativeControlHost接口,实现同样的结果。
NativeControlHost是Avalonia框架中的一个功能组件,允许在Avalonia应用中嵌入特定平台的原生控件或窗口。这对于需要与现有原生UI控件协同工作或直接访问平台特定UI功能的情况特殊有效。
以下是利用示例代码:
- public class PictureBoxHost : NativeControlHost
- {
- public nint PictureBoxHandle { get; set; }
-
- protected override IPlatformHandle CreateNativeControlCore(IPlatformHandle parent)
- {
- <UserControl xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="HB.Frame.Views.HKCamera"
- Loaded="UserControl_Loaded">
-
- <ContentControl x:Name="MyContentControl" VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch" Background="#000000"/>
- </UserControl> System.Windows.Forms.PictureBox pictureBox = new System.Windows.Forms.PictureBox();
- <UserControl xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="HB.Frame.Views.HKCamera"
- Loaded="UserControl_Loaded">
-
- <ContentControl x:Name="MyContentControl" VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch" Background="#000000"/>
- </UserControl> this.PictureBoxHandle = pictureBox.Handle;
- <UserControl xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="HB.Frame.Views.HKCamera"
- Loaded="UserControl_Loaded">
-
- <ContentControl x:Name="MyContentControl" VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch" Background="#000000"/>
- </UserControl> return new PlatformHandle(pictureBox.Handle, "HWND");
- }
- }
复制代码
这里自定义一个PictureBoxHost类 继承了 NativeControlHost基类
重写了CreateNativeControlCore方法 这个方法的目的 可以帮你创建系统任何原生组件 不仅是winform
创建了后如何利用呢?
- <UserControl xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="HB.Frame.Views.HKCamera"
- Loaded="UserControl_Loaded">
-
- <ContentControl x:Name="MyContentControl" VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch" Background="#000000"/>
- </UserControl>
复制代码 只需要创建一个ContentControl 父容器 就可以引入你创建的 PictureBoxHost类了- private async void UserControl_Loaded(object? sender, Avalonia.Interactivity.RoutedEventArgs e) {
- <UserControl xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="HB.Frame.Views.HKCamera"
- Loaded="UserControl_Loaded">
-
- <ContentControl x:Name="MyContentControl" VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch" Background="#000000"/>
- </UserControl>PictureBoxHost host= new PictureBoxHost();<UserControl xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="HB.Frame.Views.HKCamera"
- Loaded="UserControl_Loaded">
-
- <ContentControl x:Name="MyContentControl" VerticalAlignment="Stretch"
- HorizontalAlignment="Stretch" Background="#000000"/>
- </UserControl>MyContentControl.Content = host; }
复制代码
在这个示例中,我通过海康摄像头的窗口句柄将视频流成功渲染到了引入的WinForms PictureBox控件中。这利用了海康相机SDK,展示了Avalonia如何调用winform组件
注意: 记得在项目文件csproj里添加这2句
true
true
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|