2011-11-15 20 views
1

プログラムの起動時に読み込みプロセスを表示するはずのスプラッシュ画面があります。コンポーネントが読み込まれると、ラベル内のテキストを更新することができません。Wpf Xamlビューが更新されない

メインの起動プログラムprograms.csから、私はスプラッシュスクリーンコントローラでrun()メソッドを呼び出します。

startUpSplash.Run(); 

ここにコントローラがあります。これは

public class StartUpSplashController 
{ 
    public StartUpSplashViewModel ViewModel { get; set; } 

    private StartUpSplashView starUpSplashWindow = new StartUpSplashView(); 
    private delegate void UIDelegate(); 
    public void Run() 
    { 
     InitializeViewModel(); 

     ViewModel.StatusMessage = "Initializing..."; 

     starUpSplashWindow.DataContext = ViewModel; 
     starUpSplashWindow.Show(); 
    } 



    public void UpdateStatus(string statusMessage) 
    { 
     starUpSplashWindow.Dispatcher.Invoke(new UIDelegate(delegate { ViewModel.StatusMessage = statusMessage; })); 
     //ViewModel.StatusMessage = statusMessage; 
    } 

    public void End() 
    { 
     starUpSplashWindow.Close(); 
     starUpSplashWindow.InvalidateVisual(); 
    } 

    private void InitializeViewModel() 
    { 
     ViewModel = new StartUpSplashViewModel(starUpSplashWindow); 
     ViewModel.Controller = this; 
    } 
} 

が続いなど、さまざまなものが起こっているメインのProgram.csから私はスプラッシュコントローラでも、このUpdateStatusをメソッドを呼び出す「...初期化」のラベル付きスプラッシュ画面が表示されます。これは、起こっているすべての異なることを示すためにラベルを更新するためのものです。

これは更新される予定のlblのXamlです。

<Label Content="{Binding Path=StatusMessage, Mode=TwoWay, UpdateSourceTrigger= PropertyChanged}" /> 

UpdateStatusメソッドが呼び出されると、ラベルは更新されません。私が気づいた一つ奇妙なことは、私は

startupSplash.UpdateStatus("something"); 

、その後

Messagebox.show("something"); 

をした場合のメッセージボックスがポップアップした後にスプラッシュ画面が更新されたラベルを示すことでした。

これで任意の助けいただければ幸いです。

UPDATE 2:ここではビューモデルがある

public class StartUpSplashViewModel : ViewModel<IView> 
{ 
    [ImportingConstructor] 
    public StartUpSplashViewModel(StartUpSplashView view) 
     : base(view) 
    { 
    } 

    public StartUpSplashController Controller { get; set; } 

    private string _statusMessage; 
    public string StatusMessage 
    { 
     get 
     { 
      return _statusMessage; 
     } 
     set 
     { 
      if (_statusMessage == value) 
       return; 

      _statusMessage = value; 
      this.RaisePropertyChanged(s => s.StatusMessage); 
     } 
    } 
} 
+0

ViewModelにINotifyPropertyChangedインターフェイスを実装しましたか? – VS1

+0

ありがとうHenk、@ Vijay:私はviewModelを表示するために私の質問を編集しました。私は、示されているようにPropertyChangedイベントをトリガーしようとします。これは間違っていますか? –

+0

@TobyHolland starUpSplashWindow.InvalidateVisual();を呼び出さないでください。何が起こるかを見て、それが原因でUI更新が発生していないかどうかはわかりません。 –

答えて

0

は、私はトンを解決することになった方法です彼の

splashScreenControllerに別のメソッドを追加し、ViewModel.Statusメッセージを設定した後にUpdateStatusから呼び出す方法です。

[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 
    public void DoEvents() 
    { 
     DispatcherFrame frame = new DispatcherFrame(); 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
      new DispatcherOperationCallback(ExitFrame), frame); 
     Dispatcher.PushFrame(frame); 
    } 

    public object ExitFrame(object f) 
    { 
     ((DispatcherFrame)f).Continue = false; 

     return null; 
    } 
1

あなたはスプラッシュウィンドウの実行中のUIスレッドで更新を入れてみましたか? Dispatcher.Invokeメソッドを使用してこれを行うことができます。まず、あなたがデリゲートを宣言する必要があります。

private delegate void UIDelegate(); 

次に、あなたは、Dispatcherでそのデリゲートを使用します。

starUpSplashWindow.Dispatcher.Invoke(new UIDelegate(delegate 
{ 
    ViewModel.StatusMessage = statusMessage; 
})); 

UIを実行しているスレッドの更新を起動して、通常はUIを確実だろうと適切に更新されます。

+0

ありがとう、これは私が必要とするかもしれないように見えます。コントローラ内にデリゲートを宣言し、ディスパッチャをUpdateStatusメソッド内に配置しますか? –

+0

私は考えているのでそうです。あなたの例からは完全には分かりませんが、それは正しいようです。 –

+0

あなたが提案したコントローラとデリゲートを含むように質問を編集しました。それはまだ更新されていません、あなたは間違っている何かを見ることができますか? –

0

私は私がしようとしたが、それがうまくいくことを望んしていないとして、これはうまくいく場合、それを試してみるしてくださいわからない:

次のようにSplashWindow.xaml.csビューファイル内RefreshDelegateRefresh方法を作成します。 :次のように

// To Refresh the UI immediately 
private delegate void RefreshDelegate(); 
private static void Refresh(DependencyObject obj) 
{ 
    obj.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, 
     (RefreshDelegate)delegate { }); 
} 

は、コントローラでのごUpdateStatus方法を変更します。ここでは

public void UpdateStatus(string statusMessage) 
{  
    ViewModel.StatusMessage = statusMessage; 
    starUpSplashWindow.Refresh(starUpSplashWindow.statusLabel); //where statusLabel is the name of the Label 
} 
関連する問題