【问题标题】:Open WPF window in WindowsForm APP [duplicate]在Windows Form APP中打开WPF窗口[重复]
【发布时间】:2011-11-29 13:58:55
【问题描述】:

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

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

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

novoLogin nl = new novoLogin();
nl.show();

编译器给出了这个错误:

错误 1 ​​'WindowsFormsApplication1.novoLogin' 不包含 'show' 的定义并且没有扩展方法 'show' 接受第一个 可以找到“WindowsFormsApplication1.novoLogin”类型的参数 (您是否缺少 using 指令或程序集引用?)

【问题讨论】:

  • 你知道 C# 是区分大小写的,对吧?

标签: c# wpf winforms


【解决方案1】:

brief article 说明了如何实现这一目标。

如果您发现自己需要从 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:我看到你添加了代码(以及你为什么在修订版中这样做)。谢谢你,现在我可以记住这一点,以备将来的答案! :)
  • "用 WPF 窗口做你的事" 是不是真的让它工作?
  • @Paul McCarthy 不,第 4 点中的代码是使其工作的代码。 “做你的事”的意思是“设计你的 WPF 表单”。希望这能解决问题。
【解决方案2】:

看看这个: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}

【讨论】:

    【解决方案3】:

    我想在 windowForm 中显示 wpf 表单,但出现了一些资源问题...

    (因为我使用了资源..)。最后我在我的 windowsForm 项目中使用了这段代码:

    首先像这样创建应用类的全局实例:

    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() 是您要显示的窗口

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多