WPF与WindowsForms的交互

1,在WPF中调用WinForm及其控件。

1.1,在WPF中调用WinFrom窗口。

调用模态Winform窗口,可正常进行交互,无异常。

cs 复制代码
private void btnOpenWin_Click(object sender, RoutedEventArgs e)
        {
            FrmMsg win = new FrmMsg();
            win.ShowDialog();
        }

调用非模态WinForm窗口,交互能力受限,winform窗口不能接收一些键盘信息如Tab键的信息。如要正常交互则需要进行如下处理。

引入程序集:WindowsFormsIntegration.dll

cs 复制代码
private void btnOpenWin_Click(object sender, RoutedEventArgs e)
        {
            WindowsFormsHost.EnableWindowsFormsInterop();
            FrmMsg win = new FrmMsg();
            win.ShowDialog();
        }

1.2,优化WinForm窗口的显示风格。

Wpf调用的Winform窗口,其默认为XP风格,如果需要优化其风格需进行如下操作。

cs 复制代码
public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            //优化winform在Wpf中显示样式
            System.Windows.Forms.Application.EnableVisualStyles();
        }
    }

1.3,在Xaml中引入Winform控件。

添加命名空间

XML 复制代码
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

使用Wpf的WindowsFormsHost元素包裹WinForm控件。

XML 复制代码
<WindowsFormsHost Grid.Row="2">
            <!--引用wpf中没有的数字显示框-->
            <wf:NumericUpDown></wf:NumericUpDown>
        </WindowsFormsHost>

2,在Winform中调用Wpf窗口及其控件。

2.1,添加Wpf窗口。

WinForm中不能直接创建Wpf窗口,需要通过添加现有项模式加载已有的Wpf窗口。

2.2,在WinForm中调用Wpf窗口。

模态调用的Wpf窗口,可正常进行交互。

cs 复制代码
 private void btnOpenWin_Click(object sender, RoutedEventArgs e)
        {         
             WpfWin win = new WpfWin();
            win.ShowDialog();
        }

非模态调用Wpf窗口。默认情况下非模态调用的Wpf窗口无法接收键盘信息即无法交互,必须进行如下操作才可正常交互。

引用程序集:WindowsFormsIntegration.dll

cs 复制代码
private void button1_Click(object sender, EventArgs e)
        {
           WpfWin win = new WpfWin();
            //需要添加对win的引用否则win非模态窗口不能接收键盘信息,模态不存在这个问题
            ElementHost.EnableModelessKeyboardInterop(win);
            win.Show();
            
        }

2.4,Winform中添加Wpf自定义控件

WinForm中可直接创建Wpf的自定义控件,创建完自定义控件编译后通过WinForm的ElementHost控件驻留自定义的Wpf控件。

自定义的控件:

XML 复制代码
<UserControl x:Class="WinForm中调用WPF窗口.MyWPFControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WinForm中调用WPF窗口"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="27*"/>
            <RowDefinition Height="25*"/>
            <RowDefinition Height="18*"/>
            <RowDefinition Height="30*"/>
        </Grid.RowDefinitions>
        <Slider Maximum="100" Minimum="0" x:Name="slider01"></Slider>
        <TextBox Grid.Row="1" Margin="5" Background="AliceBlue" Text="{Binding ElementName=slider01, Path=Value}"></TextBox>
        <Button Margin="10" Content="提交" Grid.Row="2"></Button>
    </Grid>
</UserControl>

通过WinForm的ElementHost控件驻留。

相关推荐
zzywxc78721 分钟前
PyTorch分布式训练深度指南
人工智能·pytorch·分布式·深度学习·wpf·技术栈深潜计划
三千道应用题2 小时前
C#模式匹配用法与总结
c#
深海潜水员2 小时前
【Unity】背包系统 + 物品管理窗口 (上)
开发语言·vscode·游戏·unity·c#·游戏引擎
伽蓝_游戏2 小时前
Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(6)
游戏·ui·unity·架构·c#·游戏引擎·.net
Vae_Mars3 小时前
WPF中使用iconfont图标
wpf
User:你的影子3 小时前
WPF TreeView自带自定义滚动条
wpf
kyranhan3 小时前
C#程序本地运行正常,通过网络下载报错:FileLoadException:“未能加载文件或程序集“xxx.dll”或它的某一个依赖项。
开发语言·c#·wpf
Yueeyuee_3 小时前
【C#学习Day14笔记】泛型、集合(数组列表Arraylist、列表list)与字典
笔记·学习·c#
隐-梵5 小时前
2025年测绘程序设计比赛--基于统计滤波的点云去噪(已获国特)
java·开发语言·windows·c#·.net
R-G-B6 小时前
【09】大恒相机SDK C#开发 ——库函数 IntPtr ConvertToRGB24详细解释 及 示例
c#·大恒相机sdk·converttorgb24