Есть ли способ запустить приложение WPF без StartUpUri, который не ломает что-то еще? - PullRequest
20 голосов
/ 09 августа 2010

Я часами пытался добраться до точки, где я могу запустить приложение WPF и получить полный контроль. Я хочу иметь возможность создать ViewModel, создать View (окно), установить контекст данных View для ViewModel, а затем показать View.

Я перепробовал множество методов, наиболее многообещающим было изменить App.xaml на страницу, а затем добавить собственный метод Main. К сожалению, это не работает должным образом, потому что VS2010 не показывает стили из App.xaml в конструкторе, хотя они работают при запуске приложения.

Есть ли способ сделать то, что я хочу? Если нет, то как люди обычно запускают приложения MVVM в WPF, создавая ViewModel вне самого View?

Ответы [ 4 ]

24 голосов
/ 09 августа 2010

Я бы использовал событие запуска.Вы можете добавить это в App.xaml и удалить строку StartupUri.Когда вы добавляете его, Visual Studio может создать событие для вас в файле App.xaml.cs.Вы можете инициализировать вашу ViewModel и View в пределах.

21 голосов
/ 12 апреля 2011

Вот один простой способ ...

<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>

Вот основные 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);
    }
  }
}

Application.MainWindow можно использоватьтакже.Первое отображаемое окно будет автоматически назначено MainWindow.Конечно, вы можете пропустить создание mainView и написать непосредственно в MainWindow, что также уменьшит синтаксис.

 MainWindow = new MainView();
 MainWindow.Show();
 MainWindow.DataContext = new MainViewModel();

Последнее замечание: я делаю Show до привязки данных.Это необходимо сделать, чтобы избежать ситуации, когда MainViewModel создает исключение во время создания.Если MainView не было показано, приложение закроется, не давая увидеть ошибку.

2 голосов
/ 09 августа 2010

в нашем приложении мы выбрали способ, который вы уже предложили: написание нового метода Main.Затем вы также должны внести некоторые изменения в настройки приложения проекта (без объекта автозагрузки).Приложение xaml должно выглядеть примерно так:

<Application  x:Class="EVOCURA.App"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Startup="Application_Startup"
            Exit="Application_Exit">

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <!--Custom Controls-->
            <ResourceDictionary  Source="<your resources here>"/>


        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Код будет выглядеть примерно так:

public sealed partial class App : Application
{
    static App()
    { }

    public App()
    { }

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        // create the main window and assign your datacontext
        MainAppWindow main = new MainAppWindow();
        main.DataContext = <your datacontext here>
        main.Show();
    }

    [STAThreadAttribute]
    public static int Main(string[] args)
    {
        App app = new App();

        app.InitializeComponent();
        app.Run();

        return 0;
    }
}

Посмотрите на событие запускаи обратите внимание, что StartupUri по умолчанию не указан. im App.xaml

Вы также можете передать DataContext в новый конструктор вашего MainWindow или создать DataContext непосредственно в xaml.

1 голос
/ 09 августа 2010

Самый простой способ назначить экземпляр ViewModel для DataContext представления - это код позади окна.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new myViewModel();
    }
}

Для первой части вашего вопроса вы можете иметь контроль вашего приложения в событии запуска

<Application x:Class="myApplication.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml" Startup="Application_Startup">
    <Application.Resources>

    </Application.Resources>
</Application>

Код сзади:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        // Place your code here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...