Ответ 1
Я бы использовал событие Startup. Вы можете добавить это в App.xaml и удалить строку StartupUri. Когда вы добавите его, Visual Studio может создать событие для вас в файле App.xaml.cs. Вы можете инициализировать ViewModel и View внутри.
Я пытался часами дойти до того момента, когда я могу запустить приложение WPF и иметь полный контроль. Я хочу иметь возможность создавать ViewModel, создавать View (Window), задавать контекст данных View как ViewModel, а затем показывать View.
Я пробовал множество методов, наиболее перспективным из которых является изменение App.xaml на страницу, а затем добавление собственного метода Main. К сожалению, это не работает должным образом, потому что VS2010 не показывает стили из App.xaml в дизайнере, хотя они работают при запуске приложения.
Есть ли способ сделать то, что я хочу? Если нет, то как обычно люди запускают приложения MVVM в WPF, создавая ViewModel вне самого представления?
Я бы использовал событие Startup. Вы можете добавить это в App.xaml и удалить строку StartupUri. Когда вы добавите его, Visual Studio может создать событие для вас в файле App.xaml.cs. Вы можете инициализировать ViewModel и View внутри.
Вот один простой способ...
<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
не было показано, приложение закроется, не допуская появления ошибки.
в нашем приложении мы выбрали способ, который вы уже предложили: написание нового основного метода. Вы также должны внести некоторые изменения в настройки приложения проекта (без запуска). Приложение 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.
Самый простой способ назначить экземпляр 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
}
}