广西嘉华李家鸣 發表於 2025-4-23 15:38:00

Avalonia UI 引入winform 教程

<p data-v-da96312b=""><span style="font-family: &quot;courier new&quot;, 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: &quot;courier new&quot;, courier"><code data-v-da96312b="">NativeControlHost</code>是Avalonia框架中的一个功能组件,允许在Avalonia应用中嵌入特定平台的原生控件或窗口。这对于需要与现有原生UI控件协同工作或直接访问平台特定UI功能的情况特别有效。</span></p>
<p data-v-da96312b=""><span style="font-family: &quot;courier new&quot;, courier">以下是使用示例代码:</span></p>
<p>&nbsp;</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>&nbsp;</p>
<p>这里自定义一个PictureBoxHost类 继承了&nbsp;NativeControlHost基类</p>
<p>重写了CreateNativeControlCore方法 这个方法的目的 可以帮你创建系统任何原生组件&nbsp; 不仅是winform&nbsp;</p>
<p>创建了后如何使用呢?&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
   
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">UserControl</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>只需要创建一个ContentControl 父容器 就可以引入你创建的&nbsp;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=&nbsp;new PictureBoxHost();
      MyContentControl.Content </span>=<span style="color: rgba(0, 0, 0, 1)"> host;
    }</span></pre>
</div>
<p>&nbsp;</p>
<p>在这个示例中,我通过海康摄像头的窗口句柄将视频流成功渲染到了引入的WinForms&nbsp;<code data-v-da96312b="">PictureBox</code>控件中。这利用了海康相机SDK,展示了Avalonia如何调用winform组件</p>
<p>&nbsp;</p>
<p><strong>注意: 记得在项目文件csproj里添加这2句</strong></p>
<p> &lt;UseWindowsForms&gt;true&lt;/UseWindowsForms&gt;<br>    &lt;AllowUnsafeBlocks&gt;true&lt;/AllowUnsafeBlocks&gt;</p>
<p>&nbsp;</p>
<p><img src="https://img2024.cnblogs.com/blog/619594/202504/619594-20250423153147265-1016587874.png"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/Lxy-/p/18842877
頁: [1]
查看完整版本: Avalonia UI 引入winform 教程