在大型WPF项目中使用大型WinForms项目的一部分

时间:2015-04-16 18:16:46

标签: c# wpf winforms winforms-interop

这两个应用程序都相当陈旧,并且由几个人构建和维护了几年。目前,WinForms项目中使用的控件之一确实需要在WPF项目中显示。

我已经阅读过在WPF项目中使用WinForms控件,并且在大多数情况下,如果你只是实例化一个常规的空WinForm控件,它似乎相对简单。

我想知道你最好如何在另一个项目中使用大型项目​​的一部分?理想情况下,WinForm控件将在我们的一个WPF控件中,在ONE选项卡上,在发送并加载所需数据后可见。

1 个答案:

答案 0 :(得分:3)

以下是一些一般性指导原则。

从WPF应用程序中,将项目引用添加到:

  • 您的WinForms项目
  • WindowsFormsIntegration
  • System.Windows.Forms

修改您的XAML以包含WindowsFormsHost

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl>
            <TabItem Header="Old Form">
                <WindowsFormsHost Name="WinFormsHost"></WindowsFormsHost>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

实例化您的旧Form并将其设置为WindowsFormsHost的子项。将TopLevel设置为false或者它会抱怨“子控件不能是顶级窗体”。同时更改FormBorderStyle,以防止表单的标题栏显示并允许用户拖动表单。

public MainWindow()
{
    InitializeComponent();

    WinFormsHost.Child =
        new Form1 { TopLevel = false, FormBorderStyle = FormBorderStyle.None };
}

你最终得到这样的东西:

enter image description here

您可以在“Walkthrough: Hosting a Windows Forms Control in WPF”和“WindowsFormsHost Class”的MSDN文档中阅读更多内容。