【问题标题】:How to detect the event when media transport controls show and hide媒体传输控件显示和隐藏时如何检测事件
【发布时间】:2019-08-02 17:20:02
【问题描述】:

我正在使用 MediaPlayerElement。目前媒体传输控件可以显示和隐藏自己。但是没有事件指示何时显示和隐藏。

有什么解决方法吗?谢谢。

<MediaPlayerElement x:Name="viuMediaPlayer" AreTransportControlsEnabled="True">
        <MediaPlayerElement.TransportControls>
            <MediaTransportControls
                x:Name="MediaTransportControls_Custom"/>
        </MediaPlayerElement.TransportControls>
    </MediaPlayerElement>

【问题讨论】:

    标签: uwp media-player uwp-xaml


    【解决方案1】:

    目前,UWP 不提供 api 来检测传输控件的显示和隐藏。但您可以查看MediaTransportControls 样式。与 VisualState 匹配的隐藏和显示动画为 ControlPanelFadeInControlPanelFadeOut

    <VisualState x:Name="ControlPanelFadeIn">
    
        <Storyboard>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ControlPanel_ControlPanelVisibilityStates_Border">
                <EasingDoubleKeyFrame KeyTime="0" Value="0" />
                <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1" />
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimation Storyboard.TargetProperty="Y" Storyboard.TargetName="TranslateVertical" From="50" To="0.5" Duration="0:0:0.3" />
        </Storyboard>
    </VisualState>
    <VisualState x:Name="ControlPanelFadeOut">
    
        <Storyboard>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ControlPanel_ControlPanelVisibilityStates_Border">
                <EasingDoubleKeyFrame KeyTime="0" Value="1" />
                <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0" />
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="ControlPanel_ControlPanelVisibilityStates_Border">
                <DiscreteObjectKeyFrame KeyTime="0" Value="False" />
            </ObjectAnimationUsingKeyFrames>
            <DoubleAnimation Storyboard.TargetProperty="Y" Storyboard.TargetName="TranslateVertical" From="0.5" To="50" Duration="0:0:0.7" />
        </Storyboard>
    </VisualState>
    

    因此您可以检测到TranslateVertical Y 属性已更改为识别 MediaTransportControls 隐藏或显示状态。

     var PanelGrid = MyFindListViewChildByName(MyControl, "ControlPanelGrid") as Grid;
     var render = PanelGrid.RenderTransform;
     var watcher = new DependencyPropertyWatcher<string>(render, "Y");
     watcher.PropertyChanged += Watcher_PropertyChanged;
    
    private void Watcher_PropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
    
        if ((double)e.NewValue == 50)
        {
            System.Diagnostics.Trace.WriteLine("hide");
        }
        else if ((double)e.NewValue == 0.5)
        {
            System.Diagnostics.Trace.WriteLine("show");
        }
    
    }
    

    但是上面有个问题,如果承载上面事件的线程存在,Watcher_PropertyChanged将不可用。

    参考工具类

    public static DependencyObject MyFindListViewChildByName(DependencyObject parant, string ControlName)
    {
        int count = VisualTreeHelper.GetChildrenCount(parant);
    
        for (int i = 0; i < count; i++)
        {
            var MyChild = VisualTreeHelper.GetChild(parant, i);
            if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
                return MyChild;
    
            var FindResult = MyFindListViewChildByName(MyChild, ControlName);
            if (FindResult != null)
                return FindResult;
        }
    
        return null;
    }
    
    
    public class DependencyPropertyWatcher<T> : DependencyObject, IDisposable
    {
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register(
                "Value",
                typeof(object),
                typeof(DependencyPropertyWatcher<T>),
                new PropertyMetadata(null, OnPropertyChanged));
    
        public event DependencyPropertyChangedEventHandler PropertyChanged;
    
        public DependencyPropertyWatcher(DependencyObject target, string propertyPath)
        {
            this.Target = target;
            BindingOperations.SetBinding(
                this,
                ValueProperty,
                new Binding() { Source = target, Path = new PropertyPath(propertyPath), Mode = BindingMode.OneWay });
        }
    
        public DependencyObject Target { get; private set; }
    
        public T Value
        {
            get { return (T)this.GetValue(ValueProperty); }
        }
    
        public static void OnPropertyChanged(object sender, DependencyPropertyChangedEventArgs args)
        {
            DependencyPropertyWatcher<T> source = (DependencyPropertyWatcher<T>)sender;
    
            if (source.PropertyChanged != null)
            {
                source.PropertyChanged(source.Target, args);
            }
        }
    
        public void Dispose()
        {
            this.ClearValue(ValueProperty);
        }
    }
    

    当然,最好在 UserVoice 中发布您的要求,向我们的团队询问这项新功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 2011-05-21
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多