如何解决当我触摸滑块的拇指时会发生哪个事件?
我正在自定义一个滑块来制作视频的搜索栏。我想要的是当我触摸拇指时视频停止。然后我可以拖动拇指并显示与滑块值对应的视频。这是我在 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"/>
我尝试了很多事件,但是当鼠标指针开始接触拇指(不是点击或点击)时,它们都没有发生。有人知道这样的活动吗?
解决方法
您通常会使用 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 举报,一经查实,本站将立刻删除。