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>

posted @ 2022-04-12 22:45  Bridgebug  阅读(398)  评论(0编辑  收藏  举报