2016-06-17 36 views
0

只需從ViewModel(從MVVM Light ViewModelBase繼承)向XAML頁面上的MediaElement發言。如何從ViewModel發送流到XAML頁面上的MediaElement?

var synthesisStream = await synthesizer.SynthesizeSsmlToStreamAsync(text); 
media.AutoPlay = true; 
media.SetSource(synthesisStream, synthesisStream.ContentType); 
media.Play(); 

上面的代碼沒有ViewModel的分離。我們看到media直接在代碼隱藏中處理。

在我的ViewModel,我停在

var synthesisStream = await synthesizer.SynthesizeSsmlToStreamAsync(text); 

var msg=new PlaySpeechSynthesisStreamMessage(synthesisStream); 
Messenger.Default.Send<PlaySpeechSynthesisStreamMessage>(msg); 

對於消息:

public class PlaySpeechSynthesisStreamMessage 
{ 
    public SpeechSynthesisStream Stream { get; set; } 

    public PlaySpeechSynthesisStreamMessage(SpeechSynthesisStream stream) 
    { 
     Stream = stream; 
    } 
} 

Messenger來處理這種情況的正確方法?我們如何編寫RelayCommand或其他東西將流傳遞給media

有關文章MVVM pattern violation: MediaElement.Play()似乎解決了這個問題,但它不在MVVM Light中,也沒有辦法傳遞流。

回答

0

我認爲一條消息是處理這種情況的一個很好的解決方案。 你只需要補充信息的視圖模型與它在視圖處理髮送:

Messenger.Default.Register<PlaySpeechSynthesisStreamMessage>(this, msg => { 
    media.AutoPlay = true; 
    media.SetSource(msg.Stream, msg.Stream.ContentType); 
    media.Play(); 
}); 

或者,你可以用你提到的問題中描述的事件的方法。在這種情況下,你必須定義從EventArgs繼承與SpeechSynthesisStream類型的屬性的類,然後定義您的活動如下:

public event EventHandler<YourEventArgsClass> PlaySpeechSynthesisStreamEvent; 

,提高這樣說:

var synthesisStream = await synthesizer.SynthesizeSsmlToStreamAsync(text); 
var eventArgs = new YourEventArgsClass(synthesisStream); 
if (PlaySpeechSynthesisStreamEvent != null) 
    PlaySpeechSynthesisStreamEvent(this, eventArgs); 

在這當然,你將不得不在View中處理事件。

我發現事件處理程序的解決方案比帶消息的處理程序有點棘手,因爲您必須將事件處理連接到View的DataContext,並根據應用程序的結構,DataContext屬性View的生命週期並不總是可用的:例如,在許多情況下,我傾向於在導航到視圖期間通過導航服務和/或引導程序來設置它:在這種情況下,DataContext爲空View的構造函數,所以不可能在那裏連接事件處理函數。所以,你必須找到另一個連接它的地方,記住像OnNavigatedFrom這樣的方法(例如,在Windows 10 UWP應用程序中)可以在視圖的生命週期中多次調用,當然我們不想連線事件處理程序不止一次。 如果框架公開它(例如在Windows 10 UWP中),那麼DataContextChanged事件可能是連接與ViewModel相關的事件處理程序的好地方(並且可能刪除以前的事件,如果View的實例可以與不同的實例一起使用ViewModel類在應用程序的生命週期中)。

相關問題