我很容易尝试从控制台应用程序显示WPF窗口。在我的解决方案中,我得到了一个控制台应用程序,它是启动项目,并创建一个像这样的Wpf窗口:
class Program
{
[STAThread]
static void Main(string[] args)
{
var thread = new Thread(Foo);
thread.Start();
Console.ReadKey();
}
private static void Foo()
{
var markerService = new MarkerService();
var viewModel = new MainViewModel();
markerService.Register(viewModel);
var mainView = new MainWindow { DataContext = viewModel };
mainView.Show();
}
}
MainWindow
和MainViewModel
只是空的。当我启动项目时显示Wpf窗口但没有响应(光标正忙)。
感谢任何帮助。
问候
答案 0 :(得分:1)
您需要使用Dispatcher.Run
来启动消息循环。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WpfApplication1;
using System.Windows.Threading;
namespace ConsoleApplication2
{
class Program
{
[STAThread]
static void Main(string[] args)
{
var thread = new Thread(Foo);
thread.ApartmentState = ApartmentState.STA;
thread.Start();
Console.ReadKey();
}
private static void Foo()
{
var markerService = new MarkerService();
var viewModel = new MainViewModel();
markerService.Register(viewModel);
var mainView = new MainWindow { DataContext = viewModel };
mainView.Show();
Dispatcher.Run();
}
}
}
或者你可以使用@ mm8建议的“应用程序”对象样式,或者第三种方法就是:
mainView.ShowDialog(); // internal message pump used
更多信息:
答案 1 :(得分:0)
创建一个System.Windows.Application
对象并调用其Run
方法:
class Program
{
[STAThread]
static void Main(string[] args)
{
var thread = new Thread(Foo);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
Console.ReadKey();
}
private static void Foo()
{
var markerService = new MarkerService();
var viewModel = new MainViewModel();
markerService.Register(viewModel);
var mainView = new MainWindow { DataContext = viewModel };
System.Windows.Application app = new System.Windows.Application();
app.Run(mainView);
}
}
请注意,运行应用程序并显示窗口的线程必须是STA。
您需要添加对PresentationFramework.dll和WindowsBase.dll的引用。