0

我有一个现有的 WinForms 应用程序。在这个应用程序中,一种形式在单独的线程中被调用:

 var newDialogThread = new Thread(new ThreadStart(ShowMyForm));
 newDialogThread .Name = "CustomerViewThread";
 newDialogThread .IsBackground = true;
 newDialogThread .ApartmentState = ApartmentState.STA;
 newDialogThread .CurrentCulture = Config.CustomerCulture;

public void ShowMyForm()
{
  using(var myForm = new MyForm())
  {
     Application.Run(myForm );
   }
}

现在客户想要使用 WPF 表单而不是 WinForms 对话框。应用程序将保持基于 Winforms。

如何正确重构这部分代码,以便调用我的 WPF 表单而不是 Winforms?

 public void ShowMyForm()
    {
      using(var myWpfForm = new MyWpfForm())
      {
          // Analog of Application Run?
         //Application.Run(myForm );
       }
    }

Ps 我认为它可以创建纯 WPF 窗口而不将其托管到 Winforms。这是主要情况。

4

3 回答 3

2

听起来您需要编辑 ( WinForms)MyForm控件以向其中添加ElementHost控件,以便它可以托管您的 WPF 控件:

MyWpfForm myWpfForm = new MyWpfForm();
ElementHost elementHost = new ElementHost();
elementHost.Child = myWpfForm;
this.Controls.Add(elementHost);

这样,您可以ShowMyForm保持方法不变。

于 2013-10-28T13:31:40.147 回答
1

这篇文章解释了如何做到这一点。但基本上:

1)创建/添加类型为“WPF自定义控件库”的新项目

2) 添加类型为“Window (WPF)”的新项目

3) 用 WPF 窗口做你的事

4) 从您的 WinForms 应用程序中,创建并打开 WPF 窗口:

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

//Place the following code where you want to open the WPF window
var wpfwindow = new WPFWindow.Window1(); 
ElementHost.EnableModelessKeyboardInterop(wpfwindow); 
wpfwindow.Show();
于 2013-10-28T13:32:08.583 回答
0

我在相关线程中找到了答案: 如何在单独的线程上创建和显示 WPF 窗口?

  private void NewWindowHandler(object sender, RoutedEventArgs e)
{       
    Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
    newWindowThread.SetApartmentState(ApartmentState.STA);
    newWindowThread.IsBackground = true;
    newWindowThread.Start();
}

private void ThreadStartingPoint()
{
    Window1 tempWindow = new Window1();
    tempWindow.Show();       
    System.Windows.Threading.Dispatcher.Run();
}

http://msdn.microsoft.com/en-us/library/ms741870.aspx

于 2013-10-28T14:19:29.860 回答