2016-06-17 4 views
0

MVVM Light ViewModelBase에서 상속 된 ViewModel의 텍스트 문자열을 XAML 페이지의 MediaElement으로 말하면됩니다.ViewModel에서 XAML 페이지의 MediaElement로 스트림을 보내는 방법은 무엇입니까?

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

위 코드는 ViewModel을 구분하지 않습니다. media은 코드 숨김으로 직접 처리됩니다. 내 뷰 모델에서

, 나는 메시지에 대해

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(); 
}); 

또는, 당신은 당신이 인용 된 문제에 설명 된 이벤트 접근 방식을 사용할 수 있습니다.

public event EventHandler<YourEventArgsClass> PlaySpeechSynthesisStreamEvent; 

를하고 이런 식 인상 :이 경우 유형 SpeechSynthesisStream의 속성 EventArgs에서 상속하는 클래스를 정의해야합니다 다음, 다음과 같이 이벤트를 정의이에서

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

을 물론보기에서 이벤트를 처리해야합니다.

이벤트 핸들러를 사용하는 솔루션은 메시지가있는 것보다 조금 복잡합니다. 이벤트 처리를 뷰의 DataContext에 연결해야하고 응용 프로그램의 구조에 따라 DataContext 속성 보기의 수명이 시작될 때 항상보기를 사용할 수있는 것은 아닙니다. 예를 들어 많은 경우 탐색을 위해 탐색 서비스 및/또는 부트 스트 래퍼를 통해 설정하는 경향이 있습니다.이 경우 DataContext는 null입니다. 뷰의 생성자이므로 이벤트 핸들러를 연결할 수 없습니다. 따라서 다른 곳을 찾아야합니다. OnNavigatedFrom (예 : Windows 10 UWP 앱)과 같은 메서드가 뷰의 라이프 사이클에서 두 번 이상 호출 될 수 있음을 기억해야하며 확실하게 이벤트 연결을 원하지 않습니다 핸들러를 두 번 이상. 프레임 워크가 노출하는 경우 (예 : Windows 10 UWP), DataContextChanged 이벤트는 ViewModel과 관련된 이벤트 핸들러를 연결하는 좋은 장소가 될 수 있습니다 (이전 인스턴스를 제거 할 수도 있습니다. 뷰의 인스턴스를 다른 인스턴스와 함께 사용할 수있는 경우). 응용 프로그램의 수명 동안 ViewModel 클래스).