有没有办法在没有StartUpUri的情况下启动WPF应用程序而不破坏别的东西?

Bil*_*ves 23 wpf mvvm

我已经尝试了几个小时才能达到可以启动WPF应用程序并完全控制的程度.我希望能够创建一个ViewModel,创建一个View(Window),将View的数据上下文设置为ViewModel,然后显示View.

我尝试了很多方法,最有希望的是将App.xaml更改为页面,然后添加我自己的Main方法.不幸的是,这不能正常工作,因为VS2010然后没有在设计器中显示App.xaml的样式,尽管它们在运行应用程序时确实有效.

有办法做我想要的吗?如果没有,人们通常如何在WPF中启动MVVM应用程序,在View本身之外创建一个ViewModel?

Bla*_*asp 26

我会使用Startup事件.您可以将其添加到App.xaml并删除StartupUri行.添加它时,Visual Studio可以在App.xaml.cs文件中为您创建事件.您可以在其中初始化ViewModel和View.

  • 未来的读者,请注意您需要分配一个新事件.不要使用`protected override void OnStartup(StartupEventArgs e)`方法,因为.NET 4.5中存在一个已知错误,编译器无法加载您在App.xaml中指定的静态资源.http://stackoverflow.com/questions/543414/wpf-app-xaml-file-does-not-get-parsed-if-my-app-does-not-set-a-startupuri (16认同)

小智 23

这是一个简单的方法......

<Application 
  x:Class="Demo.Ux.WpfApp.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>
Run Code Online (Sandbox Code Playgroud)

这是基本的App.xaml.cs

public partial class App
{
  protected override void OnStartup(StartupEventArgs e)
  {
    try
    {
      var mainView = new MainView();
      mainView.Show();
      mainView.DataContext = new MainViewModel();
    }
    catch (Exception ex)
    {
      Debug.WriteLine(ex);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Application.MainWindow也可以使用.第一个显示的窗口将自动神奇地分配给MainWindow.当然,您可以跳过创建mainView和直接写入,MainWindow这也会减少语法.

 MainWindow = new MainView();
 MainWindow.Show();
 MainWindow.DataContext = new MainViewModel();
Run Code Online (Sandbox Code Playgroud)

最后一点,我Show在数据绑定之前做的.您需要这样做以避免MainViewModel在创建期间抛出异常的情况.如果MainView尚未显示,应用程序将关闭而不会让您看到错误.

  • !不要做!!! 如果随后你想要在App.xaml中添加资源,肯定会遇到麻烦(参见http://stackoverflow.com/questions/543414/wpf-app-xaml-file-does-not-get-parsed-if -my-app-does-set-a-startupuri)接受的答案没有这样的缺点. (4认同)