2017-08-27 4 views
0

私はUWPアプリケーションでMVVMLightを使用しています。私は2つの画面を持っています:MainScreen 2番目の画面を開くボタンがあります。 MainScreenから2番目の画面に移動します。私は、メイン画面上のボタンをクリックして、他のビューにデータを送信する必要がUWP MvvmLight Messengerを取得した後のUIを更新します.default.Receive

Messenger.Default.Send(someobject) 

と同様

Messenger.Default.Register<Some>(this, (action) => ReceiveMsg(action)); 

を使用しています。 問題は、データが第2画面に更新し、

アプリケーションは、私はUIを更新するには、いくつかの方法を試みた

異なるスレッドに対してマーシャリングされたインターフェイスと呼ばれる例外を発生させ得ていないです、実際にはthisthisように私は、私は一つ一つ全て上記のセグメントを試してみました

private async void ReceiveMsg(Some action) 
    { 
     try 
     { 
      //await Task.Factory.StartNew(() => { 
      // T1 = action.T1; 
      // RaisePropertyChanged(() => T1); 
      //}); 

      //SharingData.UpdateScore(action); 
      //DispatcherHelper.Initialize(); 

      //await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal 
      //  ,() => 
      //  { 
      // T1 = action.T1; 
      // RaisePropertyChanged(() => T1); 
      //  }); 

      //await Dispatcher.DispatchAsync(() => 
      //{ 
      // T1 = action.T1; 
      // RaisePropertyChanged(() => T1); 
      //},1000, Windows.UI.Core.CoreDispatcherPriority.Normal); 

      //await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
      //{ 
      // T1 = action.T1; 
      // RaisePropertyChanged(() => T1); 
      //}); 

      //var views= Windows.ApplicationModel.Core.CoreApplication.Views.ToList()[0]; 
      //await views.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => { 
      // T1 = action.T1; 
      // RaisePropertyChanged(() => T1); 
      //}); 


      var thiswindow = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher; 

      await thiswindow.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
      { 
       team1 = action.Team1; 
       this.RaisePropertyChanged("Team1"); 

      }); 

      //DispatcherHelper.CheckBeginInvokeOnUI(
      //() => 
      //{ 
      // T1 = action.T1; 
      // RaisePropertyChanged(() => T1); 
      //}); 
      //DispatcherHelper.Reset(); 
      //DispatcherHelper.Initialize(); 

     } 
     catch (Exception ex) 
     { 
      //DispatcherHelper.Reset(); 
      //Console 
     } 
    } 

次のようにすべてのこれらの可能性を試してみましたが、している何もWORまだ別のスレッドのマーシャリングエラーが発生しています。

私が間違っていることを教えてください。 プロパティはT1 = 'Some Value'のように更新されていますが、UIやRaisePropertyChangedには反映されず、例外が発生しています。

答えて

0

メイン画面のボタンをクリックして別のビューにデータを送信する必要があります。問題は、2番目の画面でデータが更新されず、例外が発生することです。

アプリケーションは、別のスレッド用にマーシャリングされたインターフェイスを呼び出しました。 Messenger

SendReceiveアクションが同じスレッドで呼び出されます。 MainScreenのボタンをクリックすると、CoreWindow.DispatcherMainScreenのディスパッチャになります。このディスパッチャを使用して2番目の画面の内容を変更すると、例外がスローされます。

解決するには、2番目の画面のメインスレッドでSendメソッドを呼び出す必要があります。

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    newView = CoreApplication.CreateNewView(); 
    int newViewId = 0; 
    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     var id = Environment.CurrentManagedThreadId; 
     Frame frame = new Frame(); 
     frame.Navigate(typeof(SecondPage), null); 
     Window.Current.Content = frame; 

     Window.Current.Activate(); 

     newViewId = ApplicationView.GetForCurrentView().Id; 
    }); 
    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId); 
} 

private async void SendBtn_Click(object sender, RoutedEventArgs e) 
{ 
    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     var id = Environment.CurrentManagedThreadId; 
     Messenger.Default.Send("Test send message!!!"); 
    }); 
} 
関連する問題