2010-01-05 57 views
2

我有以下的標記兩個問題:如何獲取UIElement的父Popup?

<Popup> 
    <Button x:Name="button"/> 
</Popup> 
  1. 爲什麼VisualTreeHelper.GetParent(button)返回NULL?
  2. 如何獲得UIElement的父Popup

回答

3
  1. 由於Button正被顯示在彈出時僅添加到視件樹。

  2. 嗯... ...棘手

編輯

中有以下一種假設,即您的彈出窗口中的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這是「按鈕」的母公司。

+0

即使打開的彈出窗口GetParent方法返回null – altso 2010-01-05 17:04:48

+0

嗯......是的,這是真的,它位於顯示在現有視覺效果之上的樹頂部。因此偏移是相對於Silverlight控件本身。 – AnthonyWJones 2010-01-05 17:19:29

2

Popup控制有時很煩人。目前我還不知道爲什麼VisualTreeHelper.GetParent(button)返回null。但對於第二個this可能有所幫助。

0

zihotki的解決方案看起來很有前景(我還沒有測試過)。

雖然VisualTreeHelper.GetParent(button)返回null,您可以使用button.Parent,它應該給你彈出對象。

+0

@DaveClemmer:哇 - 是否有編輯問題和每一個答案的徽章? – RobSiklos 2013-08-21 16:14:27

5

而不是通過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作爲父母,但它爲我工作。