Winform项目中,可以直接使用wpf中的自定义控件和窗体
测试环境:
vistual studio 2017
window 10
一 winform直接使用wpf的自定义控件
步骤如下:
1 新建winfrom项目,名为WinFormDemo,默认有一个名为Form1的窗体,先不要动它
2 想要在winform项目中直接使用wpf的东西,需要添加引用:
PresentationCore.dll PresentationFramework.dll WindowsBase.dll
如果不记得要添加那个dll,有个比较快的方式就是,在为项目添加新建项的时候,选择'用户控件(WPF)'模板,点击确定后,会自动帮你添加引用,这样就不用自己手工引用了,如下图:
3 添加Wpf自定义控件UserControl1.xaml(在步骤2已经添加了),并编辑如下:
UserControl1.xaml的前台代码如下:
对应的后台代码UserControl1.xaml.cs如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace WinFormDemo
{/// <summary>/// UserControl1.xaml 的交互逻辑/// </summary>public partial class UserControl1 : UserControl{public UserControl1(){InitializeComponent();}private void BtnEnter_Click(object sender, RoutedEventArgs e){MessageBox.Show("确定1按钮按下");}}
}
4 生成本项目(一定要先生成项目),然后打开winform默认新建Form1的设计器,在右边的工具箱,可以看到控件UserControl1了,然后把它拽进Form1窗体里面,如下图:
5 再生成项目,运行后点击'确定1'按钮运行结果如下:
不过通过观察后发现,运行的程序有很明显的卡顿
二 winform直接使用wpf的窗体
winfrom通过新建项的方式不能直接新建wpf窗体,但我们可以使用新建的wpf的用户控件,然后略做修改就行,当然你也可以添加已有的wpf窗体,这样就可以省略2.1步骤的操作。
2.1 在前文的基础上继续操作(当然咯,这三个PresentationCore.dll PresentationFramework.dll WindowsBase.dll引用是少不了的),新建项,模板选择'用户控件(WPF)',名称为WindowTest
修改WindowTest.xaml:
把根标签UserControl修改为Window,并按照如下图,在Grid标签中新增内容如下:
按照如下要求修改后台代码WindowTest.xaml.cs:
2.2 在winfrom的Button按钮事件中触发弹出wpf窗体,在Form1窗体中拽入winform的Button控件,按钮名称为'弹出wpf窗体',控件名称为btnWpf,事件名称为btnWpf_Click,如下图:
以模态的方式弹出wpf窗体(即ShowDiaglog),如下图:
运行结果如下图:
以非模态的方式(即Show的方式)弹出wpf窗体
发现Wpf窗体中的TextBox在英文输入法的情况下,输入不了字母和数字
查阅资料后发现,在Show前需要添加这一句代码:
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(windowTest);
完整如下图:
加上后,再次运行,这样一切都正常了。