WPF(Winform)
Winform中调用WPF
1.打开窗体
在winform项目中添加引用:
- PresentationCore
- PresentationFramework
- WindowsBase
然后添加相应的WPF程序,就可以通过 Show()方法打开窗体。
但是这样打开的窗体不能够接收键盘的输入(若是模态的窗口,即对话框的形式,就可以不用考虑下面的),还需要添加 WindowsFormsIntegration 引用。
MainWindow mainWindow = new MainWindow();
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(mainWindow);
mainWindow.Show();
在显示窗口之前调用 EnableModelessKeyboardInterop 方法,将传递指向新的WPF窗口的引用,当调用该方法时,ElementHost 类为 Windows 窗体应用程序添加了消息过滤器。当WPF窗口处于活动状态并向窗口发送键盘消息时,这个消息过滤器就会拦截键盘消息,如果不使用这个细节,WPF控件就不会接收到任何键盘输入。
2.驻留控件
同样需要添加上述的几个引用,然后利用ElementHost实现驻留:
ElementHost elementHost = new ElementHost();
elementHost.Child = new ProgramList(); //ProgramList为一个WPF的UserControl
elementHost.Dock = DockStyle.Fill;
this.panel1.Controls.Add(elementHost);
WPF中调用Winform
1.打开窗体
在WPF项目中添加引用:
System.Windows.Forms
和在Winform中打开WPF窗口一样,当是以非模态打开时,需添加WindowsFormsIntegration 引用。
WindowsFormsHost.EnableWindowsFormsInterop();
Form1 form1 = new Form1();
form1.Show();
即使不调用该方法也仍会显示窗体,但不能识别所有键盘的输入,例如,不能使用Tab键将焦点从一个控件转移到下一个控件。
当在WPF中显示Winform窗体时,窗体会为按钮和其他通用控件使用旧样式(XP以前的样式)风格。为了支持更新的风格,必须明确调用EnableVisualStyles。
namespace WpfApp1 { using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); System.Windows.Forms.Application.EnableVisualStyles(); } } }
2.驻留控件
为在WPF窗口中显示Winform控件,需要使用 System.Windows.Forms.Integration名称空间中的WindowsFormsHost类。
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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"
xmlns:local="clr-namespace:WpfApp1"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid x:Name="grid">
<WindowsFormsHost>
<wf:PropertyGrid/>
</WindowsFormsHost>
</Grid>
</Window>