Avalonia UI 引入winform 教程


在将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)
     {
         System.Windows.Forms.PictureBox pictureBox = new System.Windows.Forms.PictureBox();
         this.PictureBoxHandle = pictureBox.Handle;
         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)
    {
PictureBoxHost host= new PictureBoxHost(); MyContentControl.Content
= host; }

 

在这个示例中,我通过海康摄像头的窗口句柄将视频流成功渲染到了引入的WinForms PictureBox控件中。这利用了海康相机SDK,展示了Avalonia如何调用winform组件

 

注意: 记得在项目文件csproj里添加这2句

<UseWindowsForms>true</UseWindowsForms>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>