Windows runtime 测试指针是否位于UIElement上
在WPF中,我可以轻松测试鼠标是否位于UIElement上: 我想在WinRT中也这样做,但是对于Windows.UI.Xaml.UI元素,似乎没有与IsMouseOver等效的东西 作为一种解决方法,我可以为PointerEntered和PointerExit事件添加两个处理程序,但我正在寻找更直接的解决方案。在uwp中,没有名为IsPointerOver的属性。但正如您所知,它有PointerEntered和PointExited的事件句柄。我们可以自定义元素并定义新的propertyIsPointerOver和包装这些事件。例如,我使用IsPointerOver属性包装了一个自定义控件,如下所示:Windows runtime 测试指针是否位于UIElement上,windows-runtime,windows-10-universal,Windows Runtime,Windows 10 Universal,在WPF中,我可以轻松测试鼠标是否位于UIElement上: 我想在WinRT中也这样做,但是对于Windows.UI.Xaml.UI元素,似乎没有与IsMouseOver等效的东西 作为一种解决方法,我可以为PointerEntered和PointerExit事件添加两个处理程序,但我正在寻找更直接的解决方案。在uwp中,没有名为IsPointerOver的属性。但正如您所知,它有PointerEntered和PointExited的事件句柄。我们可以自定义元素并定义新的propertyIsP
class NewButton : Button
{
public static readonly DependencyProperty IsPointOverProperty = DependencyProperty.Register(
"IsPointerOver", typeof(bool), typeof(NewButton), new PropertyMetadata(false));
public bool IsPointOver
{
get { return (bool)GetValue(IsPointOverProperty); }
set { SetValue(IsPointOverProperty, value); }
}
protected override void OnPointerEntered(PointerRoutedEventArgs e)
{
base.OnPointerEntered(e);
IsPointOver = true;
}
protected override void OnPointerExited(PointerRoutedEventArgs e)
{
base.OnPointerExited(e);
IsPointOver = false;
}
}
更多详情请参考。但这并不适用于所有UI元素
因此,通过另一种方式,您可以调用该方法,该方法可以确定给定名称的元素是否存在于应用程序UI中某个点的z顺序中的任何位置。您可以获取鼠标指针的坐标,并调用此方法来判断元素是否位于上方。有关如何获取鼠标指针位置,请参考官方示例的场景2。在UWP中,使用PointerRoutedEventArgs.GetCurrentPoint UIElement获取相对于指定元素左上角的指针位置。假设UIElement是矩形的,您可以测试该点的X和Y是否>=0和<宽度/高度 上面的事件句柄是获取Ispointover状态的最简单方法。稍后我会根据你的情况提出其他建议供你参考。
Windows.UI.Xaml.UIElement el = ...;
bool isPointerOver = ???
class NewButton : Button
{
public static readonly DependencyProperty IsPointOverProperty = DependencyProperty.Register(
"IsPointerOver", typeof(bool), typeof(NewButton), new PropertyMetadata(false));
public bool IsPointOver
{
get { return (bool)GetValue(IsPointOverProperty); }
set { SetValue(IsPointOverProperty, value); }
}
protected override void OnPointerEntered(PointerRoutedEventArgs e)
{
base.OnPointerEntered(e);
IsPointOver = true;
}
protected override void OnPointerExited(PointerRoutedEventArgs e)
{
base.OnPointerExited(e);
IsPointOver = false;
}
}