Подтвердить что ты не робот

Есть ли способ запустить приложение WPF без StartUpUri, которое не сломает что-то еще?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

<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 не было показано, приложение закроется, не допуская появления ошибки.

Ответ 3

в нашем приложении мы выбрали способ, который вы уже предложили: написание нового основного метода. Вы также должны внести некоторые изменения в настройки приложения проекта (без запуска). Приложение 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.

Ответ 4

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

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

        DataContext = new myViewModel();
    }
}

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

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