我在選項卡(WPF應用程序)中有一個WPF usercontrol(myGraphicControl)。WPF:確定面板是否對用戶可見
當表格大小改變時,我重畫了myGraphicControl中的圖形。
由於重繪操作是我需要做的只有在可見選項卡中的控制。
WPF(用戶)控件如何檢測它是否「實際可見」?
PS。
由Visible我的意思是說用戶可以看到它。 說,如果一個Visible TextBox位於當前不可見的選項卡中,則該文本框不會被用戶看到。
我在選項卡(WPF應用程序)中有一個WPF usercontrol(myGraphicControl)。WPF:確定面板是否對用戶可見
當表格大小改變時,我重畫了myGraphicControl中的圖形。
由於重繪操作是我需要做的只有在可見選項卡中的控制。
WPF(用戶)控件如何檢測它是否「實際可見」?
PS。
由Visible我的意思是說用戶可以看到它。 說,如果一個Visible TextBox位於當前不可見的選項卡中,則該文本框不會被用戶看到。
也許UIElement.IsVisible會有幫助嗎?它適用於標籤內容。 無論如何,您可以使用here所述的解決方案。
我還有一個解決方案。 TabControl的當前實現從可視化樹中刪除不活動的選項卡。因此,另一種確定元素是否可見的方法是找到PresentationSource。對於非活動選項卡的元素,它將爲空。
我不相信這裏有一個快速修復的解決方案,但您可能可以使用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);
然而一個電話,我要指出,我沒有嘗試過這個自己,那它可能不會在下列情況下工作:
我發現,雖然史蒂夫的方法一般工作,它會更可靠地工作,如果你從子控件的中間某處得到一個點。我猜測,佈局四捨五入可能會使InputHitTest檢查有些不準確。所以,將他的第一行改爲以下,你就是金:
var childTopLeft = childControl.TranslatePoint(new Point(childControl.RenderSize.Width/2, childControl.RenderSize.Height/2), parentControl);
你是什麼意思?在頂部,不以任何方式遮掩? – 2011-04-06 13:11:55
@Erno看到我的編輯。 – serhio 2011-04-06 13:38:15
我有同樣的問題,我解決了它。我在這個線程中編寫了解決方案: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