2017-06-06 24 views
-2

シリアルポートから受信したデータでMainPage UIを更新しようとしました。データが受信されると、イベントが発生するので、MVVMLightを使用してUIを更新するためにMainPageにメッセージを送信します。ここで何が間違っているのでしょうか?MessageDialog ShowAsync致命的な失敗

メインコンストラクタから関数を呼び出そうとした場合、またはシリアルイベントが発生した後に単純なTextBlockを更新する場合でも、次のサンプルは正常に機能します

private void OnMsgRecieved(PortMsg obj) 
{ 
    ShowDialog(obj.StringID); 
} 

private async void ShowDialog(string msg) 
{ 
    var dlg = new MessageDialog(msg); 
    try 
    { 
     await Dispatcher.RunAsync(CoreDispatcherPriority.High, async() => 
     { 
      await dlg.ShowAsync(); 
     }); 
    } 
    catch (Exception exc) 
    { 
     // Catastrophic Failure 
    } 
} 

答えて

3

説明によると、私はあなたがUIThreadMessageDialogを作成していないので、これが起こると思います。ディスパッチャーの中に置いてください。

これ以外にも、何らかの間違ったコンテキスト(これはもう表示されないページなど)から呼び出されているかどうかを確認することもできますが、この問題が発生する可能性は低くなります。

+0

あなたの最初の仮定は正しいです!しかし、これは絶対的なケースではない、つまり、ディスパッチャの内部で使用されている間にディスパッチャの外で宣言されたすべての変数には適用されません。どんな解釈? – usefulBee

+1

@usefulBee UI要素の場合です。ディスパッチャ内に作成する必要があります。もちろん、UI以外のオブジェクトや文字列などの変数は、どこにでも作成してDispatcherで使用することができます。 –

関連する問題