Avalonia UI 引入winform 教程
<p data-v-da96312b=""><span style="font-family: "courier new", courier">在将WPF升级到Avalonia时,可能很多开发者习惯使用WPF的<strong><code data-v-da96312b="">WindowsFormsHost</code></strong>来嵌入<strong>WinForms</strong>组件。Avalonia虽然没有<code data-v-da96312b="">WindowsFormsHost</code>,但提供了功能类似的<code data-v-da96312b="">NativeControlHost</code>接口,实现同样的效果。</span></p><p data-v-da96312b=""><span style="font-family: "courier new", courier"><code data-v-da96312b="">NativeControlHost</code>是Avalonia框架中的一个功能组件,允许在Avalonia应用中嵌入特定平台的原生控件或窗口。这对于需要与现有原生UI控件协同工作或直接访问平台特定UI功能的情况特别有效。</span></p>
<p data-v-da96312b=""><span style="font-family: "courier new", courier">以下是使用示例代码:</span></p>
<p> </p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> PictureBoxHost : NativeControlHost
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> nint PictureBoxHandle { <span style="color: rgba(0, 0, 255, 1)">get</span>; <span style="color: rgba(0, 0, 255, 1)">set</span><span style="color: rgba(0, 0, 0, 1)">; }
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> IPlatformHandle CreateNativeControlCore(IPlatformHandle parent)
{
System.Windows.Forms.PictureBox pictureBox </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> System.Windows.Forms.PictureBox();
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.PictureBoxHandle =<span style="color: rgba(0, 0, 0, 1)"> pictureBox.Handle;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> PlatformHandle(pictureBox.Handle, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">HWND</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}
}</span></pre>
</div>
<p> </p>
<p>这里自定义一个PictureBoxHost类 继承了 NativeControlHost基类</p>
<p>重写了CreateNativeControlCore方法 这个方法的目的 可以帮你创建系统任何原生组件 不仅是winform </p>
<p>创建了后如何使用呢? </p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">UserControl </span><span style="color: rgba(255, 0, 0, 1)">xmlns</span><span style="color: rgba(0, 0, 255, 1)">="https://github.com/avaloniaui"</span><span style="color: rgba(255, 0, 0, 1)">
xmlns:x</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.microsoft.com/winfx/2006/xaml"</span><span style="color: rgba(255, 0, 0, 1)">
xmlns:d</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.microsoft.com/expression/blend/2008"</span><span style="color: rgba(255, 0, 0, 1)">
xmlns:mc</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.openxmlformats.org/markup-compatibility/2006"</span><span style="color: rgba(255, 0, 0, 1)">
mc:Ignorable</span><span style="color: rgba(0, 0, 255, 1)">="d"</span><span style="color: rgba(255, 0, 0, 1)"> d:DesignWidth</span><span style="color: rgba(0, 0, 255, 1)">="800"</span><span style="color: rgba(255, 0, 0, 1)"> d:DesignHeight</span><span style="color: rgba(0, 0, 255, 1)">="450"</span><span style="color: rgba(255, 0, 0, 1)">
x:Class</span><span style="color: rgba(0, 0, 255, 1)">="HB.Frame.Views.HKCamera"</span><span style="color: rgba(255, 0, 0, 1)">
Loaded</span><span style="color: rgba(0, 0, 255, 1)">="UserControl_Loaded"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ContentControl </span><span style="color: rgba(255, 0, 0, 1)">x:Name</span><span style="color: rgba(0, 0, 255, 1)">="MyContentControl"</span><span style="color: rgba(255, 0, 0, 1)"> VerticalAlignment</span><span style="color: rgba(0, 0, 255, 1)">="Stretch"</span><span style="color: rgba(255, 0, 0, 1)">
HorizontalAlignment</span><span style="color: rgba(0, 0, 255, 1)">="Stretch"</span><span style="color: rgba(255, 0, 0, 1)"> Background</span><span style="color: rgba(0, 0, 255, 1)">="#000000"</span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">UserControl</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>只需要创建一个ContentControl 父容器 就可以引入你创建的 PictureBoxHost类了</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">async</span> <span style="color: rgba(0, 0, 255, 1)">void</span> UserControl_Loaded(<span style="color: rgba(0, 0, 255, 1)">object</span>?<span style="color: rgba(0, 0, 0, 1)"> sender, Avalonia.Interactivity.RoutedEventArgs e)
{<br> PictureBoxHost host= new PictureBoxHost();
MyContentControl.Content </span>=<span style="color: rgba(0, 0, 0, 1)"> host;
}</span></pre>
</div>
<p> </p>
<p>在这个示例中,我通过海康摄像头的窗口句柄将视频流成功渲染到了引入的WinForms <code data-v-da96312b="">PictureBox</code>控件中。这利用了海康相机SDK,展示了Avalonia如何调用winform组件</p>
<p> </p>
<p><strong>注意: 记得在项目文件csproj里添加这2句</strong></p>
<p> <UseWindowsForms>true</UseWindowsForms><br> <AllowUnsafeBlocks>true</AllowUnsafeBlocks></p>
<p> </p>
<p><img src="https://img2024.cnblogs.com/blog/619594/202504/619594-20250423153147265-1016587874.png"></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/Lxy-/p/18842877
頁:
[1]