微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我触摸滑块的拇指时会发生哪个事件?

如何解决当我触摸滑块的拇指时会发生哪个事件?

我正在自定义一个滑块来制作视频的搜索栏。我想要的是当我触摸拇指时视频停止。然后我可以拖动拇指并显示与滑块值对应的视频。这是我在 XAML 中的 Slider

<Slider Style="{StaticResource SliderStyle1}" Grid.Column="1" x:Name="volumeSlider" 
Width="Auto"  VerticalAlignment="Center" ValueChanged="volumeSlider_ValueChanged" 
DragLeave="volumeSlider_DragLeave" dragenter="volumeSlider_dragenter" 
DragStarting="volumeSlider_DragStarting" 
ManipulationStarted="volumeSlider_ManipulationStarted" ManipulationMode="All" 
Tapped="volumeSlider_Tapped"/>

enter image description here

我尝试了很多事件,但是当鼠标指针开始接触拇指(不是点击或点击)时,它们都没有发生。有人知道这样的活动吗?

解决方法

您通常会使用 PointerPressed 事件(请参阅 docs)。然而,这有两个问题。首先,Thumb 已经处理了这种指针交互,所以 PointerPressed 永远不会冒泡出 Slider。其次,它会在 Slider 的任何位置触发,而不仅仅是拇指。

要解决此问题,您需要在 Thumb 本身上处理事件。首先,我们将创建一个搜索可视化树的辅助方法:

public T FindChild<T>(DependencyObject parent)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent,i);
        if (child is T typedChild)
        {
            return typedChild;
        }
        var inner = FindChild<T>(child);
        if (inner != null)
        {
            return inner;
        }
    }
    return default;
}

请注意,作为 Visual Tree Extensions 的一部分,Windows Community Toolkit 中提供了该方法和许多类似的有用方法。

现在,我们在控件中搜索 Thumb

var thumb = FindChild<Thumb>(MySlider);

最后,我们附加 PointerPressed 事件。因为它已经由 Slider 控件本身处理,所以我们需要使用 AddHandler,它允许我们观察标记为已处理的事件:

thumb.AddHandler(
    UIElement.PointerPressedEvent,new PointerEventHandler(Thumb_PointerPressed),true);

然后在处理程序中您可以执行任何您需要的操作:

private void Thumb_PointerPressed(object sender,PointerRoutedEventArgs e)
{
    // ...
}
,

根据您的描述,您希望在鼠标指针开始接触拇指时发生事件。 PointerEntered 事件在指针进入该元素的命中测试区域时发生,符合您的要求。

更新:

源自官方文档,鼠标输入与第一次检测到鼠标输入时分配的单个指针相关联。单击鼠标按钮(左键、滚轮或右键)会通过 PointerPressed 事件在指针和该按钮之间创建辅助关联。 PointerReleased 事件仅在释放相同的鼠标按钮时触发。 由于这种独占关联,其他鼠标按钮单击通过 PointerMoved 事件进行路由。因此,您可以找到名为“HorizontalThumb”的 Thumb 控件,并添加如下所示的 PointerMoved 事件。

private async void HorizontalThumb_PointerMoved(object sender,PointerRoutedEventArgs e)
{
    Windows.UI.Xaml.Input.Pointer ptr = e.Pointer;
    if (ptr.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
    {
        Windows.UI.Input.PointerPoint ptrPt = e.GetCurrentPoint(MySlider);
        if (ptrPt.Properties.IsLeftButtonPressed)
        {
          //add your code to stop video                 
        }
    }
    e.Handled = true;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。