【问题标题】:Test whether the pointer is over a UIElement测试指针是否在 UIElement 上
【发布时间】:2018-08-01 18:20:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 上面的事件句柄是获取 Ispointover 状态的最简单方法。稍后我会根据您的情况给出其他建议,您可以参考。

标签: windows-runtime windows-10-universal


【解决方案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 方法,该方法可以确定给定名称的元素是否存在于应用程序UI 中某个点的z 顺序中的任何位置。您可以获取鼠标指针的坐标并调用该方法来判断元素是否指向。鼠标指针位置的获取方法请参考BasicInput官方示例的场景二。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多