2011-03-13 212 views
6

我正在尋找方法來有效地確定控件是否實際可見並可點擊。我的意思是超出檢查對象的可見性屬性。確定對象是否可見並可點擊

我可以檢查RenderSize,如果父元素中的任何一個被摺疊,那麼將會是[0,0]。所以這也很簡單。我還可以向上遍歷可視化樹,看看是否所有元素的不透明度設置爲1

我不知道究竟怎麼很好地檢查有這些情景:

  1. 目的是通過阻礙一些其他物體。顯然,可以使用FindElementsInHostCoordinates()並進行計算來找出這些對象有多少阻塞,但這可能是一種矯枉過正。我也可以對所討論的對象進行「截圖」,並對整個頁面進行「截圖」,並檢查像素應該與實際對象像素匹配的像素。這聽起來也是一種矯枉過正。
  2. 該物體被一個透明物體阻擋,該物體仍然「吞下」點擊(水龍頭)。在這種情況下,第一個問題的解決方法仍然可能會失敗。

更新(多一個的情況)

  1. 目的是出了父對象/屏幕的界。除了很多計算之外,還有其他方法可以找到它嗎?

有沒有更好的辦法?我想念什麼?

謝謝!

回答

3

可以編程測試可視性和元素的HitTestVisible財產,但超過這個你無法實際測試如果click事件將被轉發到該元素或者在它上面的元素吞噬 - 因爲堵或轉發點擊可能發生在事件處理程序方法中,您無法以通用方式確定。

看看下面的例子:

  • 你想測試,如果ParentElement面板點擊在其上有
  • ChildElement一個ChildElement具有連接到它的事件處理程序處理click事件,它是可見並且其HitTestVisible屬性設置爲true。
  • 基於此,您還不能確定事件是否會被轉發至ParentElement:在ChildElement的點擊事件處理程序中,它可以將事件的Handled屬性設置爲true,以阻止ParentPanel接收事件,或者可以將其保留在假的情況下,使ParentPanel接收事件。

因此,如果涉及自定義EventHandler,您將無法確定某個元素是否可點擊。您可以做的最多的是檢查兒童和父母元素上的VisiblityIsHitTestVisible屬性,並使用TransformToVisual方法檢查孩子/父母相對於彼此呈現的位置。

+0

謝謝!我添加了另一個可疑的情況。有任何想法嗎? – 2011-03-13 08:28:00

0

您正在查找VisualTreeHelper.FindElementsInHostCoordinates。返回的第一個元素將是在該像素上點擊鼠標的元素。當然,正如Gergely所說,你不能分辨出該元素是否會忽略點擊並將其傳遞給你。

下面是一個示例函數:

// pass in a point and the UIElement that the point is relative to 
// (or null if the point is relative to the root visual) 
public static UIElement HitTest(Point p, UIElement relativeTo = null) 
{ 
    if (relativeTo != null) 
     p = relativeTo.TransformToVisual(Application.Current.RootVisual) 
    return VisualTreeHelper 
      .FindElementsInHostCoordinates(p, Application.Current.RootVisual) 
      .FirstOrDefault(); 
}