Я пытался в течение многих часов перейти к сути дела, где я могу запустить приложение WPF и иметь полный контроль. Я хочу смочь создать ViewModel, создать Представление (Окно), установить контекст данных Представления, чтобы быть ViewModel, затем показать Представление.
Я попробовал много методов, самое многообещающее существо для изменения App.xaml, чтобы быть страницей и затем добавлением моего собственного Основного метода. К сожалению, это не работает правильно, потому что VS2010 затем не показывает стили от App.xaml в разработчике, хотя они действительно работают при запущении приложения.
Существует ли способ сделать то, что я хочу? В противном случае, как люди обычно запускают приложения MVVM в WPF, создавая ViewModel за пределами самого Представления?
Я бы использовал событие Startup. Вы можете добавить это в App.xaml и удалить строку StartupUri. Когда вы добавите его, Visual Studio может создать для вас событие в файле App.xaml.cs. Вы можете инициализировать вашу ViewModel и View внутри.
Самый простой способ назначить экземпляр ViewModel контексту данных представления - это использовать код за окном.
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>
Code Behind:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
// Place your code here
}
}
в нашем приложении мы выбрали способ, который вы уже предложили: написать новый метод Main. Также необходимо внести некоторые изменения в настройки приложения проекта (отсутствие объекта startup). Приложение 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;
}
}
Посмотрите на событие Startup Event и обратите внимание, что в App.xaml не указан StartupUri по умолчанию
Вы также можете передать DataContext в новый конструктор вашего MainWindow, или создать DataContext прямо в xaml.