我有以下的標記兩個問題:如何獲取UIElement的父Popup?
<Popup>
<Button x:Name="button"/>
</Popup>
- 爲什麼
VisualTreeHelper.GetParent(button)
返回NULL? - 如何獲得
UIElement
的父Popup
?
我有以下的標記兩個問題:如何獲取UIElement的父Popup?
<Popup>
<Button x:Name="button"/>
</Popup>
VisualTreeHelper.GetParent(button)
返回NULL?UIElement
的父Popup
?由於Button
正被顯示在彈出時僅添加到視件樹。
嗯... ...棘手
編輯
中有以下一種假設,即您的彈出窗口中的UserControl
的XAML定義,因此雖然它的子不得在可視樹中彈出原始控件。
重複使用我之前發佈的一些代碼(我真的必須讓我成爲博客)。
public static class VisualTreeEnumeration
{
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
foreach (var descendent in Descendents(child))
yield return descendent;
}
}
}
這增加了一個擴展方法的DependencyObject
它使用VisualTreeHelper
統一爲在視覺樹添加對象的搜索。因此,在用戶控件的代碼背後,你可以這樣做: -
var popup this.Descendents()
.OfType<Popup>()
.Where(p => p.Child == button)
.FirstOrDefault();
這將找到Popup
這是「按鈕」的母公司。
Popup
控制有時很煩人。目前我還不知道爲什麼VisualTreeHelper.GetParent(button)
返回null。但對於第二個this可能有所幫助。
zihotki的解決方案看起來很有前景(我還沒有測試過)。
雖然VisualTreeHelper.GetParent(button)
返回null,您可以使用button.Parent
,它應該給你彈出對象。
@DaveClemmer:哇 - 是否有編輯問題和每一個答案的徽章? – RobSiklos 2013-08-21 16:14:27
而不是通過VisualTree
,你剛剛嘗試了一段時間的循環,以走過元素的父母?
private void TryClosePopupParent(object o)
{
while (o != null)
{
Popup p = (o as Popup);
if(p == null)
{
o = (o as FrameworkElement).Parent;
}
else
{
p.IsOpen = false;
break;
}
}
}
我還沒有測試過它的東西,不有PopUp
作爲父母,但它爲我工作。
確保PopUp
連接到VisualTree
。在「備註」部分查找更多信息 http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.popup(v=vs.95).aspx
即使打開的彈出窗口GetParent方法返回null – altso 2010-01-05 17:04:48
嗯......是的,這是真的,它位於顯示在現有視覺效果之上的樹頂部。因此偏移是相對於Silverlight控件本身。 – AnthonyWJones 2010-01-05 17:19:29