C# WPF Mediaelement。位置不工作

C# WPF Mediaelement。位置不工作,c#,.net,wpf,position,mediaelement,C#,.net,Wpf,Position,Mediaelement,我需要的是在WPF的MediaElement控件上设置Position属性。但当我播放视频时,(通过play()或通过Opacity上的某种动画),它根本不起作用。它显示的是00:00:00时间,但我希望它设置为00:00:05 我有硬编码的位置值,它根本不起作用 以防万一,我会把我所有的代码,我有这样你可以看到整个动画逻辑 有线索吗 public partial class CrossFadeTransition : UserControl { DoubleAnim

我需要的是在WPF的
MediaElement
控件上设置
Position
属性。但当我播放视频时,(通过
play()
或通过
Opacity
上的某种动画),它根本不起作用。它显示的是00:00:00时间,但我希望它设置为00:00:05

我有硬编码的位置值,它根本不起作用

以防万一,我会把我所有的代码,我有这样你可以看到整个动画逻辑

有线索吗

  public partial class CrossFadeTransition : UserControl
    {
        DoubleAnimation _doubleAnimationFrontPlayer = new DoubleAnimation();
        DoubleAnimation _doubleAnimationBackPlayer = new DoubleAnimation();

        Storyboard _sb1 = new Storyboard();
        Storyboard _sb2 = new Storyboard();

        public TimeSpan Duration = TimeSpan.FromSeconds(2);
        public Dictionary<string, Position2D> PlayerPosition { set; get; }

        public CrossFadeTransition()
        {
            InitializeComponent();

            Player1.LoadedBehavior = MediaState.Manual;
            Player1.UnloadedBehavior = MediaState.Stop;

            Player2.LoadedBehavior = MediaState.Manual;
            Player2.UnloadedBehavior = MediaState.Stop;

            PlayerPosition = new Dictionary<string, Position2D>();

            PlayerPosition.Add("Player1", Position2D.Front);
            PlayerPosition.Add("Player2", Position2D.Back);

        }
        Position2D positionPlayer1;
        Position2D positionPlayer2;

        public void Stop()
        {
            if (Player1.IsEnabled)
                Player1.Stop();

            if (Player2.IsEnabled)
                Player2.Stop();

        }

        public void Start(Uri uri, int? position)
        {
            try
            {
                positionPlayer1 = PlayerPosition["Player1"];

                positionPlayer2 = PlayerPosition["Player2"];

                if (positionPlayer1 == Library.Position2D.Back)
                {
                    Player1.Source = uri;
                    if (Player1.IsEnabled)
                        Player1.Stop();

                    Player1.Position = TimeSpan.FromSeconds(5); // IT IS NOT WORKING !!!

                    Player1.Play();

                }

                if (positionPlayer2 == Library.Position2D.Back)
                {
                    Player2.Source = uri;
                    if (Player2.IsEnabled)
                        Player2.Stop();

                    Player2.Position = TimeSpan.FromSeconds(5); // IT IS NOT WORKING !!!

                    Player2.Play();

                }



                _sb1.Children.Clear();
                _sb2.Children.Clear();



                if (positionPlayer1 == Position2D.Front)
                {
                    _doubleAnimationFrontPlayer.From = 1;
                    _doubleAnimationFrontPlayer.To = 0;
                    _doubleAnimationFrontPlayer.Duration = new Duration(Duration);

                    PlayerPosition["Player1"] = Position2D.Back;
                }
                else if (positionPlayer1 == Position2D.Back)
                {
                    _doubleAnimationFrontPlayer.From = 0;
                    _doubleAnimationFrontPlayer.To = 1;
                    _doubleAnimationFrontPlayer.Duration = new Duration(Duration);

                    PlayerPosition["Player1"] = Position2D.Front;
                }

                if (positionPlayer2 == Position2D.Front)
                {
                    _doubleAnimationBackPlayer.From = 1;
                    _doubleAnimationBackPlayer.To = 0;
                    _doubleAnimationBackPlayer.Duration = new Duration(Duration);

                    PlayerPosition["Player2"] = Position2D.Back;
                }
                else if (positionPlayer2 == Position2D.Back)
                {
                    _doubleAnimationBackPlayer.From = 0;
                    _doubleAnimationBackPlayer.To = 1;
                    _doubleAnimationBackPlayer.Duration = new Duration(Duration);

                    PlayerPosition["Player2"] = Position2D.Front;
                }

                _sb1.Children.Add(_doubleAnimationFrontPlayer);
                Storyboard.SetTargetProperty(_doubleAnimationFrontPlayer, new PropertyPath("(Panel.Opacity)"));
                Storyboard.SetTarget(_doubleAnimationFrontPlayer, Player1);
                _sb1.Completed += _sb1_Completed;
                _sb1.Begin();

                //
                _sb2.Children.Add(_doubleAnimationBackPlayer);
                Storyboard.SetTargetProperty(_doubleAnimationBackPlayer, new PropertyPath("(Panel.Opacity)"));
                Storyboard.SetTarget(_doubleAnimationBackPlayer, Player2);
                _sb2.Completed += _sb2_Completed;
                _sb2.Begin();

            }
            catch (Exception)
            {

                throw;
            }
        }

        void _sb2_Completed(object sender, EventArgs e)
        {
            _sb2.Completed -= _sb2_Completed;

            Debug.WriteLine("Player2 COMPLETED " + DateTime.Now.TimeOfDay);

            if (positionPlayer2 == Position2D.Front)
            {
                Player2.Stop();
            }
        }

        void _sb1_Completed(object sender, EventArgs e)
        {
            _sb1.Completed -= _sb1_Completed;

            Debug.WriteLine("Player1 COMPLETED " + DateTime.Now.TimeOfDay);
            if (positionPlayer1 == Position2D.Front)
            {
                Player1.Stop();
            }
        }
    }

但是没有快乐…

我找到了一些解决办法。它并不完全理想,因为有时它会显示第一个视频帧,但至少它可以工作

  • 我们需要那些可以应用新
    位置的事件

    void Player2_MediaOpened(object sender, RoutedEventArgs e)
    {
         Player2.Position = new TimeSpan(0, 0, 7);
    }
    
    void Player1_MediaOpened(object sender, RoutedEventArgs e)
    {
        Player1.Position = new TimeSpan(0, 0, 7);
    }
    
  • 我们必须像这样关闭Mediaelement

    Player1.Stop();
    Player1.Close();
    Player1.Source = uri;
    Player1.Play();
    

  • 玩得开心!(啤酒)

    这给我省去了很多麻烦。它也适用于流媒体。
    Player1.Stop();
    Player1.Close();
    Player1.Source = uri;
    Player1.Play();