Uwp 当我触摸滑块的拇指时会发生什么事件?
我自定义一个滑块,使视频搜索栏。我想要的是,当我触摸拇指时,视频停止。然后我可以拖动拇指并显示与滑块值对应的视频。这是我在XAML中的滑块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
<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)
{
// ...
}