在Windows Form应用程序中打开WPF窗口

11

我在我的WindowsForm应用程序中添加了一个名为novoLogin的新WPF窗口。

添加后,我添加了system.xaml引用......调试正常。

现在我正在尝试从现有的WindowsForm中打开这个新窗口。

novoLogin nl = new novoLogin();
nl.show();
编译器给出以下错误提示:
“错误1 'WindowsFormsApplication1.novoLogin'不包含名称为'show'的定义,且没有接受类型为'WindowsFormsApplication1.novoLogin'的第一个参数的扩展方法'show'可以被找到(是否缺少using指令或程序集引用?)”

4
你知道C#是大小写敏感的,对吧? - madd0
3个回答

31

这篇简短的文章解释了如何在WinForms程序中打开WPF窗口。

  1. 创建/添加一个类型为 WPF Custom Control Library 的新项目
  2. 添加一个类型为 Window (WPF) 的新项
  3. 进行WPF窗口相关操作
  4. 从您的WinForms应用程序中创建并打开WPF窗口。

using System;  
using System.Windows.Forms;  
using System.Windows.Forms.Integration;  

var wpfwindow = new WPFWindow.Window1(); 
ElementHost.EnableModelessKeyboardInterop(wpfwindow); 
wpfwindow.Show();

@Purplegoldfish:我看到你在修订中添加了代码(以及你为什么这样做)。谢谢你,现在我可以将其记在心中,以备将来回答问题!:) - Abbas
用 WPF 窗口做你的事情。这是使它工作的实际东西吗? - Paul McCarthy
1
@Paul McCarthy 不是的,第4点中的代码是使其工作的代码。 "Do your thing" 的意思是“设计你的WPF表单”。希望这样能澄清问题。 - Abbas

5
请看这个链接:http://www.mobilemotion.eu/?p=1537&lang=en 简述如下:
打开项目清单文件(扩展名为.csproj或.vbproj),使用任何文本编辑器。通常顶级节点包含多个标签,每个构建配置一个,并且有一个全局的。在全局节点(没有条件属性的节点)中搜索子节点或如果不存在则创建。该节点应包含两个GUID:FAE04EC0-301F-11D3-BF4B-00C04F79EFBC,代表C#项目,以及60dc8134-eba5-43b8-bcc9-bb4bc16c2548代表WPF。完整行应如下所示:
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
(如果您对细节感兴趣,codeproject拥有完整的项目GUID列表: http://www.codeproject.com/Reference/720512/List-of-Visual-Studio-Project-Type-GUIDs
在Visual Studio中重新加载项目,并打开“添加新项”向导。
由于该项目现在已正式归类为WPF项目,因此该向导现在应包含WPF窗口选项。顺便说一句,由于没有WinForms项目GUID可以覆盖,因此这种方法不会损害现有的项目组件。
我刚试过了VB.NET项目也可以使用这种方法!
当然,如果您使用VB.NET,则必须编辑上述行,将GUID从{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}替换为{F184B08F-C81C-45F6-A57F-5ABD9991F28F}。

1

我希望能够在Windows窗体中展示WPF表单,但是出现了一些资源问题(因为我使用了资源)。最终,在我的Windows窗体项目中,我使用了以下代码:

首先创建一个全局的应用程序类实例,像这样:

WPFTest.App app;

为什么这是全局的?

因为这个类是单例的,在同一个AppDomain中不能创建多个实例。

现在举个例子,你有一个按钮事件来显示WPF表单。在按钮事件中我们有:

    private void button1_Click(object sender, EventArgs e)
    {
        if (System.Windows.Application.Current == null)
        {
            app = new WPFTest.App()
            {
                ShutdownMode = ShutdownMode.OnExplicitShutdown
            };
            app.InitializeComponent();
        }
        else
        {
            app = (WPFTest.App)System.Windows.Application.Current;
            app.MainWindow = new WPFTest.YourWindow();
            System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(app.MainWindow);
            app.MainWindow.Show();
        }
    }

注意:WPFTest是您的项目名称,YourWindow()是您想要显示的窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接