MediaElement - Merkwürdiges Problem

  • WPF

Es gibt 49 Antworten in diesem Thema. Der letzte Beitrag () ist von KaskadekingDE.

    1. Schwer zu sagen. Ich könnte mir vorstellen, dass es etwas mit der Reihenfolge der Commands in den Groups zu tun hat oder auch mit der Reihenfolge, in der der Commandmanager die Commandbindings und die RelayCommands updatet. Da musst du mal etwas rumprobieren.
    2. Du hast doch Value an eine Property im ViewModel gebunden. Wenn also die Sliderposition geändert wird, wird der Setter dieser Property aufgerufen.
    1. Komisch ?( Aber eigentlich ist es genau die gleiche Reihenfolge wie bei der PauseCommandGroup. Dann werde ich dort mal gucken.
    2. Das weiß ich ja. Also soll ich die Position im Setter festlegen?
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Gut so hier sieht es aus:

    C#-Quellcode

    1. public TimeSpan ElementPosition
    2. {
    3. get { return _position; }
    4. set
    5. {
    6. if (_position == value) return;
    7. _position = value;
    8. var v = _position.TotalSeconds/ElementLength.TotalSeconds;
    9. var position = _audioSource.Length*(long) v;
    10. _audioSource.Position = position;
    11. OnPropertyChanged(new PropertyChangedEventArgs("ElementPosition"));
    12. }
    13. }


    Jedoch funktioniert dadurch die Audioausgabe nicht mehr, sie funktioniert 1-2 Sekunden lang wenn ich die Position ändere aber danach bricht sie wieder ab. Wahrscheinlich benutze ich die falschen Werte bei var v = _position.TotalSeconds/ElementLength.TotalSeconds;
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    C#-Quellcode

    1. var position = _audioSource.Length*(long) v;

    v liegt zwischen 0 und 1, wenn du das in einen Ganzzahlwert umwandelst kann nur exakt 0 rauskommen, das Audio fängt also wieder von vorne an.
    Ich meine, bei CSCore konnte man auch gleich mit TimeSpans arbeiten.
    Kann ich mir vorstellen. Liegt daran, dass das Mediaelement durchgehend die Position verändert und dann quasi ein endloser Strom an Positionsneusetzungen an die Audiosource kommt.
    Da müsstest du gegebenenfalls für das Mediaelement und den Slider zwei verschiedenen Properties anlegen und zwischen denen so delegieren, dass die Position der Audiosource nur gesetzt wird, wenn die Änderung vom SLider aus kommt, nicht vom Mediaelement.

    Artentus schrieb:

    zwei verschiedenen Properties anlegen

    Gut das ist mir jetzt klar.

    Artentus schrieb:

    Änderung vom Slider aus kommt, nicht vom Mediaelement.

    Wie oder wo kann man abfragen von welchen Steuerelement die Änderung kommt bzw. wie kann man mehrere Properties für ein Element festlegen? Sorry, versteh ich nicht so ganz :S Hatte schon ein paar Ideen aber die haben nicht funktioniert bzw. sind nicht MVVM Konform
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯
    Du bindest Slider.Value an eine Property und MediaElement.Position an eine andere. Die Position der Audiosource wird nur gesetzt, wenn sich die Property, an die der Slider gebunden ist, geändert wird.
    Dann musst du nur noch bei Änderung der einen Property die andere setzen, allerdings über das Backingfield, nicht über den Setter, weil ansonsten eine Endlosschleife ausgeführt wird. Nicht vergessen, dann auch PropertyChanged für die jeweils andere Property aufzurufen.
    Ah ok :thumbsup:

    MainViewModel:
    Spoiler anzeigen

    C#-Quellcode

    1. public TimeSpan ElementPosition
    2. {
    3. get { return _position; }
    4. set
    5. {
    6. if (_position == value) return;
    7. _position = value;
    8. _sliderPosition = value;
    9. OnPropertyChanged(new PropertyChangedEventArgs("SliderPosition"));
    10. OnPropertyChanged(new PropertyChangedEventArgs("ElementPosition"));
    11. }
    12. }
    13. public TimeSpan SliderPosition
    14. {
    15. get { return _sliderPosition;}
    16. set
    17. {
    18. if (_sliderPosition == value) return;
    19. _sliderPosition = value;
    20. _audioSource.SetPosition(value);
    21. ElementPosition = value;
    22. OnPropertyChanged(new PropertyChangedEventArgs("SliderPosition"));
    23. }
    24. }

    XAML:
    Spoiler anzeigen

    XML-Quellcode

    1. <ownControls:ExtendedMediaElement x:Name="MedElement" Source="{Binding Path=MediaUri, Mode=TwoWay}" MediaPosition="{Binding ElementPosition, Mode=TwoWay}" MediaLength="{Binding ElementLength, Mode=OneWayToSource}" LoadedBehavior="Manual" UnloadedBehavior="Stop" ScrubbingEnabled="True" Margin="0,0,0,21"/>
    2. <Slider Name="SliderMovePosition" Value="{Binding Path=SliderPosition, Converter={StaticResource TimeConverter}, Mode=TwoWay}" Maximum="{Binding ElementLength, Converter={StaticResource TimeConverter}, Mode=OneWay}" SmallChange="1" LargeChange="{Binding Path=LargeChangeSlider, Mode=TwoWay}" TickFrequency="{Binding Path=TickFrequenceSlider, Mode=TwoWay}" Margin="0,330,0,0" Background="White"></Slider>



    So funktionierts jetzt. Edit: Man sollte mal einen XAML-Code Button einführen. Die Formatierung geht ja mal gar nicht :rolleyes:
    Edit2: Hab beim Stop-Button nun return true; angegeben. Der Button bleibt trotzdem ausgegraut :huh:
    KaskadekingDE on GitHub :)
    Bitte keine Fragen über Programmierung per PN! Dafür ist das Forum hier.

    Who cares? ¯\_(ツ)_/¯

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KaskadekingDE“ ()