2017-10-11 52 views
0

私は、いくつかの長いタスクが完了している間にスプラッシュ画面を表示するMVVM WPFアプリケーションを持っています。WPF MVVMアプリケーションのスプラッシュ画面

このスプラッシュ画面は典型的なWPFウィンドウであり、非常にシンプルで、「Loading ...」やスピナーなどのカスタムテキストを表示するためのラベルしかありません。

コードビハインドには、InitializeComponentおよびイベントWindow_Loadedのみが実行されるコンストラクタのみがあります。

メインMVVM WPFアプリケーションから、長いタスクを実行すると、このウィンドウがインスタンス化され、スプラッシュ画面が表示されます。

これで、スプラッシュ画面のラベルに表示されているテキストをカスタマイズしたいと思います。だから最善のアプローチは何ですか?

私が行ったことは、ウィンドウ(スプラッシュスクリーン)をインスタンス化するときに、パラメータとして文字列(カスタムメッセージ)をコンストラクタに渡すことです。このスプラッシュ画面として

Window mySplash = new SplashScreen("Loading or whatever I want"); 

は、唯一のスプラッシュ非常に簡単です、私はそれがここにMVVMを適用しても意味を持っていないと思うので、コードビハインドで私は、パラメータとして渡された文字列で設定私有財産を作成しますコンストラクタに渡します。次に、このプライベートプロパティでラベルをバインドし、最後にコードビハインド(ビュー)にINotifyPropertyChangedを実装します。ここにモデル、モデルビューはありません。

これは正しい方法ですか?または他の方法がありますか?私はスプラッシュスクリーンをインスタンス化したら、それをアクセス後、

x:FieldModifier="public" 

と私は私は、このソリューションを好きではない:私はそこにこれを追加することによって、ビュー内のラベルを公表するなど、他のソリューションは、知っている

外にラベルを公開したくない

試行#1:

メインMVVM WPFアプリケーションでの私のビューモデルから、私は以下を実行:

Window splashScreen = new SplashScreen("Loading ..."); 

スプラッシュ画面ウィンドウ:

<Window x:Class="My.Apps.WPF.SplashScreen" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Grid> 
    <!-- Grid row and column definitions here --> 
     <Label Grid.Row="0" Content="{Binding Path=Message}"/> 
    </Grid> 
</Window> 

スプラッシュスクリーンコードビハインド:

public partial class SplashScreen: Window 
{ 
    public string Message 
    { 
     get 
     { 
      return (string)GetValue(MessageProperty); 
     } 
     set { SetValue(MessageProperty, value); } 
    } 
    public static readonly DependencyProperty 
     MessageProperty = 
     DependencyProperty.Register("Message", 
     typeof(string), typeof(System.Window.Controls.Label), 
     new UIPropertyMetadata("Working, wait ...")); 

    public SplashScreen(string message) 
    { 
     InitializeComponent(); 

     if (!String.IsNullOrEmpty(message)) 
      this.Message = message; 
    } 

}

Labelのデフォルト値を設定しました。コンストラクタにパラメータとして渡されない場合に使用されます。

xamlプレビューでは、Visual Studio IDE環境のラベルにデフォルトのメッセージが表示されません。また、何らかの理由で、ビュー・モデルからカスタム・メッセージをパラメータとして渡すと、ラベルには表示されません。私は間違って何をしていますか?

+1

あなたはMVVMで滞在したい場合、あなたは自分のウィンドウにしたDependencyPropertyを追加し、それにラベルを結合することができます。 –

+2

ここにはMVVMやプライベートプロパティは必要ありません。コンストラクタ内で渡された文字列に直接ラベルテキストを設定するだけです。もちろん、メインアプリケーションのビューモデルからそのウィンドウをインスタンス化しないようにする必要があります。なぜなら、全体のコンセプトを破るからです。 – Evk

+0

@Evkはい、ビューモデルからスプラッシュ画面をインスタンス化し、インスタンス化するときにカスタム文字列を渡します。だから、dependencyPropertyを使う方がいいですか? ManfredRadlwimmerが語ったように。 – user1624552

答えて

2

あなたは、グリッドのためのDataContextを設定しませんでした:

<Window x:Class="My.Apps.WPF.SplashScreen" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Name="Splash" 
> 

    <Grid DataContext="{Binding ElementName=Splash}"> 
    <!-- Grid row and column definitions here --> 
     <Label Grid.Row="0" Content="{Binding Path=Message}"/> 
    </Grid> 
</Window> 
+0

あなたの言うことをやっているだけでなく、これを修正する必要がありました: typeof(System.Window.Controls.Label)to typeof(SplashScreen) – user1624552

関連する問題