2011-04-06 82 views
4

我在選項卡(WPF應用程序)中有一個WPF usercontrol(myGraphicControl)。WPF:確定面板是否對用戶可見

當表格大小改變時,我重畫了myGraphicControl中的圖形。

由於重繪操作是我需要做的只有在可見選項卡中的控制。

WPF(用戶)控件如何檢測它是否「實際可見」?

PS。

由Visible我的意思是說用戶可以看到它。 說,如果一個Visible TextBox位於當前不可見的選項卡中,則該文本框不會被用戶看到。

+0

你是什麼意思?在頂部,不以任何方式遮掩? – 2011-04-06 13:11:55

+0

@Erno看到我的編輯。 – serhio 2011-04-06 13:38:15

+0

我有同樣的問題,我解決了它。我在這個線程中編寫了解決方案:http://stackoverflow.com/questions/1517743/in-wpf-how-can-i-determine-whether-a-control-is-visible-to-the-user/42254899# 42254899 – 2017-02-21 15:43:24

回答

1

也許UIElement.IsVisible會有幫助嗎?它適用於標籤內容。 無論如何,您可以使用here所述的解決方案。

我還有一個解決方案。 TabControl的當前實現從可視化樹中刪除不活動的選項卡。因此,另一種確定元素是否可見的方法是找到PresentationSource。對於非活動選項卡的元素,它將爲空。

+0

)比方說,在問這裏之前,測試「IsVisible」是可以測試的第一件事。我的元素總是IsVisible,這意味着它不是隱藏的,但如果用戶可以看到它,則不會被隱藏,因爲它處於「非活動」選項卡中。 – serhio 2011-04-06 13:36:11

+0

感謝您的第二個鏈接。不幸的是我的控制不在Scrollwiever中,而是在TabControl的選項卡中。 – serhio 2011-04-06 13:39:33

+1

好吧,我也測試過了。此屬性在「非活動」選項卡中的元素爲false。也許你應該重複你的測試? :) – 2011-04-06 13:44:03

3

我不相信這裏有一個快速修復的解決方案,但您可能可以使用UIElement.InputHitTest(Point)做些事情。

你可以做類似

//get the coordinates of the top left corner of the child control within 
//the parent 
var childTopLeft = childControl.TranslatePoint(new Point(), parentControl); 
//check whether or not the child control is returned when you request the element 
//at that coordinate through hit testing 
var isVisible = (parentControl.InputHitTest(childTopLeft) == childControl); 

然而一個電話,我要指出,我沒有嘗試過這個自己,那它可能不會在下列情況下工作:

  • 透明物品 - 一般來說,透明背景會導致控件的命中測試傳遞給父項
  • 部分遮擋物品 - 一次只能擊中一個點,因此如果只有部分子控件可見將h大街檢查正確的點
2

我發現,雖然史蒂夫的方法一般工作,它會更可靠地工作,如果你從子控件的中間某處得到一個點。我猜測,佈局四捨五入可能會使InputHitTest檢查有些不準確。所以,將他的第一行改爲以下,你就是金:

var childTopLeft = childControl.TranslatePoint(new Point(childControl.RenderSize.Width/2, childControl.RenderSize.Height/2), parentControl);