web-dev-qa-db-ja.com

他の何かを壊さないStartUpUriなしでWPFアプリケーションを開始する方法はありますか?

私は、WPFアプリケーションを開始して完全に制御できるようになるまで、何時間も努力してきました。 ViewModelを作成し、View(Window)を作成し、ViewのデータコンテキストをViewModelに設定してから、Viewを表示できるようにしたいと思います。

私は多くのメソッドを試しましたが、最も有望なのは、App.xamlをページに変更してから、独自のMainメソッドを追加することです。残念ながら、これは正しく機能しません。これは、VS2010ではApp.xamlのスタイルがデザイナーに表示されないためですが、アプリの実行時には機能します。

私がやりたいことをする方法はありますか?そうでない場合、人々は通常、WPFでMVVMアプリを起動し、ビュー自体の外部にViewModelを作成する方法を教えてください。

23
Bill Jeeves

Startupイベントを使用します。これをApp.xamlに追加し、StartupUri行を削除できます。追加すると、VisualStudioはApp.xaml.csファイル内にイベントを作成できます。 ViewModelとViewを内部で初期化できます。

26
BlackWasp

これが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が表示されていない場合、アプリはエラーを表示せずに閉じます。

23
digitalMoto

私たちのアプリケーションでは、あなたがすでに提案した方法を選択しました:新しい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を作成することもできます。

2
JanW

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