私は、WPFアプリケーションを開始して完全に制御できるようになるまで、何時間も努力してきました。 ViewModelを作成し、View(Window)を作成し、ViewのデータコンテキストをViewModelに設定してから、Viewを表示できるようにしたいと思います。
私は多くのメソッドを試しましたが、最も有望なのは、App.xamlをページに変更してから、独自のMainメソッドを追加することです。残念ながら、これは正しく機能しません。これは、VS2010ではApp.xamlのスタイルがデザイナーに表示されないためですが、アプリの実行時には機能します。
私がやりたいことをする方法はありますか?そうでない場合、人々は通常、WPFでMVVMアプリを起動し、ビュー自体の外部にViewModelを作成する方法を教えてください。
Startupイベントを使用します。これをApp.xamlに追加し、StartupUri行を削除できます。追加すると、VisualStudioはApp.xaml.csファイル内にイベントを作成できます。 ViewModelとViewを内部で初期化できます。
これが1つの簡単な方法です...
<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
が表示されていない場合、アプリはエラーを表示せずに閉じます。
私たちのアプリケーションでは、あなたがすでに提案した方法を選択しました:新しい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がApp.xamlで指定されていないことに注意してください。
MainWindowの新しいコンストラクターでDataContextを渡すか、xamlで直接DataContextを作成することもできます。
ViewModelのインスタンスをビューのDataContextに割り当てる最も簡単な方法は、ウィンドウの背後にあるコードを使用することです。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new myViewModel();
}
}
質問の最初の部分では、StartUpイベントでアプリケーションのcontrolを使用できます。
<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
}
}