2016-09-26 56 views
0

在WPF我可以很容易地测试鼠标是否超过UIElement测试指针是否超过的UIElement

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

我想要做的WinRT相同,但似乎没有相当于IsMouseOverWindows.UI.Xaml.UIElement

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

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

+1

上面的事件句柄是获得Ispointover状态的最简单方法。稍后我会根据你的情况提出你可能参考的其他建议。 –

回答

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。