Uwp 当我触摸滑块的拇指时会发生什么事件?

Uwp 当我触摸滑块的拇指时会发生什么事件?,uwp,slider,uwp-xaml,Uwp,Slider,Uwp Xaml,我自定义一个滑块,使视频搜索栏。我想要的是,当我触摸拇指时,视频停止。然后我可以拖动拇指并显示与滑块值对应的视频。这是我在XAML中的滑块 <Slider Style="{StaticResource SliderStyle1}" Grid.Column="1" x:Name="volumeSlider" Width="Auto" VerticalAlignment="Center" V

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

<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"/>


我尝试过许多事件,但当鼠标指针开始触摸拇指(不是点击或单击)时,没有一个事件发生。有人知道这类事件吗?

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

更新:

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

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;
}

您通常会使用
PointerPressed
事件(请参阅)。然而,这有两个问题。首先,
Thumb
已经处理了这样的指针交互,因此
PointerPressed
永远不会从
滑块中冒泡出来。其次,它将针对
滑块的任何位置触发,而不仅仅是拇指

要解决此问题,您需要在
拇指上处理事件。首先,我们将创建一个助手方法来搜索可视树:

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;
}
最后,我们附加
指针pressed
事件。因为它已经由
滑块
控件本身处理,所以我们需要使用
AddHandler
,它允许我们观察标记为已处理的事件:

thumb.AddHandler(
    UIElement.PointerPressedEvent, 
    new PointerEventHandler(Thumb_PointerPressed), 
    true);
在处理程序中,您可以执行任何需要的操作:

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

对不起,如果我的描述让你误解了。我认为
PointerEntered
是指针开始悬停在
滑块上的时候。但我的意思是,当指针开始触摸拇指时(当鼠标按下拇指时),您可以通过更改
滑块样式1
来实现这一点。请在您的样式中找到名为
HorizontalThumb
Thumb
控件,并添加
Tapped
事件。当我这样设置时,仅当鼠标光标按下并抬起时,Tapped才会触发。此外,在XAML中设置PointerPressed事件时不起作用。我已经更新了前面的答案,您可以检查它是否满足您的要求。点击/点击有什么区别?这是否意味着鼠标被按下的时间更长?@MartinZikmund这就是我将鼠标指针放在拇指上并开始按下的时候。只有在我已经按下并释放鼠标按钮的情况下,点击和单击才会执行。如果我在调用InitializeComponent函数后找到thumb,则MySlider将不会有任何子项。所以我必须在PageLoaded上调用FindChild函数。这是为什么?原因是在那个特定的时刻,
滑块的
模板还没有应用,所以子项还不存在。您还可以在
Slider.Loaded
中执行它,或者从
Slider
派生并覆盖
应用程序模板
private void Thumb_PointerPressed(object sender, PointerRoutedEventArgs e)
{
    // ...
}