none
[UWP] MediaElement im Viewmodel mit MediaEnded und/oder CurrentStateChanged RRS feed

  • Frage

  • Hallo,

    ich habe eine UWP in welcher eine Sprachausgabe erzeugt wird (Beispiel):

    VoiceInformation voiceInfo =
                          (
                            from voice in SpeechSynthesizer.AllVoices
                            where voice.Gender == VoiceGender.Female & voice.Language == "en-US"
                            select voice
                          ).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
                synthesizer.Voice = voiceInfo;
                SpeechSynthesisStream stream = await synthesizer.SynthesizeTextToStreamAsync("Hello World");
    
                // Send the stream to the media object.
                mediaElement.SetSource(stream, stream.ContentType);
                mediaElement.Play();

    Die Sprachausgabe erfolgt in unterschiedlichen Sprachen.

    Da ich gerne wissen möchte, wann die Sprachausgabe beendet ist, hatte ich gehofft ganz einfach ein passendes Event hinzufügen zu können:

    mediaElement = new MediaElement();
    mediaElement.MediaEnded += MediaElement_MediaEnded;
    mediaElement.CurrentStateChanged += MediaElement_CurrentStateChanged;

    Da das ganze im Viewmodel passiert, habe ich das Mediaelement auch dort erzeugt:

    MediaElement mediaElement;

    Leider werden die Events nicht gefeuert..... 

    Wo ist mein Fehler?

    Danke/Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Dienstag, 7. März 2017 22:29

Antworten

Alle Antworten

  • Hallo Stefan,

    ich weiß das was ich jetzt schreibe widerspricht dem gängigen MVVM Pattern das man mit WPF verwendet.

    Du solltest das ViewModel Plattform unabhängig halten. Damit keine UIElemente und keine Events. Dies gehört in UWP in die CodeBehind. Tipps zu MVVM und Sprachleistung

    Mit Google findest Du ein paar Lösungsansätze, empfehlen würde ich Dir keins uwp mediaelement event from viewmodel

    Ich entwickle meine Apps nach MVC so kann ich immer andere Plattformen wie z.B. Xamarin einfach hinzunehmen. Das geht natürlich auch mit MVVM aber nicht wenn das ViewModel Plattform abhängig ist


    Gruß, Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Dienstag, 7. März 2017 23:27
  • Hallo Stefan,

    als Ergänzung zu dem was Thomas geschrieben hat:

    Das MediaElement spielt nur dann etwas ab, wenn es auch in der UI verankert ist. Es muss dabei nicht sichtbar sein, aber eben im Tree enthalten sein. So wie hier gezeigt habe ich es damals auch gelöst. Fand ich zwar nicht schön, aber ging schnell. Ordentlich entwickelt würde ich vermutlich ein eigenes Control zum Kapseln des MediaElements nutzen dass ich via Eigenschaften steuern kann. Also über etwas wie IsPlaying.

    Ebenfalls möglich wäre auch noch die Weiterleitung von Events an Commands. Das ist auch gängige Praxis.

    Nur so am Rande: Was das Plattformunabhängige angeht, so mag ich auch dort MVVM mehr als MVC - man sollte dann aber nichts gegen Dependency Injection haben.


    Viele Grüße, Tom Lambert - MVP, MCC und MSP
    Wozu Antworten markieren und Posts bewerten? Klicke hier
    Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
    Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub

    Mittwoch, 8. März 2017 00:41

  • Du solltest das ViewModel Plattform unabhängig halten. Damit keine UIElemente und keine Events. Dies gehört in UWP in die CodeBehind. Tipps zu MVVM und Sprachleistung

    Mit Google findest Du ein paar Lösungsansätze, empfehlen würde ich Dir keins uwp mediaelement event from viewmodel


    Vielen Dank für deine Antwort. Stimmt absolut, das MediaElement hat nichts im ViewModel zu suchen... Danke auch für die Links.


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Donnerstag, 9. März 2017 10:50

  • Das MediaElement spielt nur dann etwas ab, wenn es auch in der UI verankert ist. Es muss dabei nicht sichtbar sein, aber eben im Tree enthalten sein. So wie hier gezeigt habe ich es damals auch gelöst. Fand ich zwar nicht schön, aber ging schnell. Ordentlich entwickelt würde ich vermutlich ein eigenes Control zum Kapseln des MediaElements nutzen dass ich via Eigenschaften steuern kann. Also über etwas wie IsPlaying.

    Ebenfalls möglich wäre auch noch die Weiterleitung von Events an Commands. Das ist auch gängige Praxis.

    Nur so am Rande: Was das Plattformunabhängige angeht, so mag ich auch dort MVVM mehr als MVC - man sollte dann aber nichts gegen Dependency Injection haben.

    Vielen Dank auch für deine Antwort. Das MediaElement spielt zwar ab, so wie ich es habe, aber ihr habt Recht. Das Ding hat nix im ViewModel zu suchen. Weiterleitung von Events habe ich schon gemacht, aber der Tip mit dem eigenen Control ist Klasse, das werde ich machen.


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Donnerstag, 9. März 2017 10:53