2017-06-06 45 views
-2

我嘗試使用從串行端口接收的數據更新MainPage UI。一旦收到數據,就會引發一個事件,所以我使用MVVMLight向MainPage發送一條消息,希望能夠更新UI。這裏有什麼可能是錯的?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

根據其描述,我認爲這是因爲你不UIThread創建MessageDialog。把它放在Dispatcher裏面,一切都應該沒問題。

除此之外,您還可以檢查是否從某個錯誤的上下文(例如,某個不再顯示的頁面)中調用該方法,但不太可能導致此問題。

+0

你的第一個假設是正確的!但這不是絕對的情況,換句話說,它並不適用於在調度程序內部使用的所有變量。任何解釋?! – usefulBee

+1

@usefulBee UI元素就是這種情況。您應該在分派器中創建它們。當然,非UI對象或像字符串這樣的變量可以在任何地方創建並在Dispatcher中使用。 –

相關問題