测试指针是否在UIElement上

时间:2016-09-26 03:20:44

标签: windows-runtime windows-10-universal

在WPF中,我可以轻松测试鼠标是否超过UIElement

System.Windows.UIElement el = ...;
bool isMouseOver = el.IsMouseOver;

我想在WinRT中做同样的事情,但IsMouseOver似乎没有等同于Windows.UI.Xaml.UIElement

Windows.UI.Xaml.UIElement el = ...;
bool isPointerOver = ???

作为一种解决方法,我可以为PointerEntered和PointerExited事件添加两个处理程序,但我正在寻找更直接的解决方案。

2 个答案:

答案 0 :(得分:1)

在uwp中,UIElement没有名为IsPointerOver的媒体资源。但是如您所知,它具有PointerEnteredPointExited的事件句柄。我们可以自定义元素并定义新属性IsPointerOver并包装这些事件。例如,我使用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;
    }       
}

更多详情请参阅this thread。但这并不适合所有UI元素。

因此,对于另一种方法,您可以调用VisualTreeHelper.FindElementsInHostCoordinates方法,该方法可以确定给定Name的元素是否存在于应用程序UI中Point处的z顺序中的任何位置。您可以获取鼠标指针的坐标并调用此方法来判断元素是否指向上方。有关如何获取鼠标指针的位置,请参考BasicInput官方样本的方案2。

答案 1 :(得分:0)

在UWP中,使用PointerRoutedEventArgs.GetCurrentPoint(UIElement)获取相对于指定元素左上角的指针位置。假设您的UIElement是矩形的,则可以测试该点的X和Y> = 0和