2016-04-06 68 views
0

我们的代码中有很多地方显示未连接到父级的弹出窗口。换句话说,它是如何枚举所有弹出窗口?

var objPopup = new Popup() { 
    Child = objControl, 
    IsOpen = true 
}; 

在屏幕上同时出现2个或3个弹出窗口是正常的。是否可以枚举所有当前显示的弹出窗口?使用VisualTreeHelper枚举Window.Current.Content中的所有元素都无济于事。它仅返回逻辑树中的元素。如果弹出窗口放置在XAML上,它将显示在结果中。如果它在代码中被实例化,它不会。我需要找到所有当前显示的弹出窗口。怎么做?

回答

0

Popup不承载自己内的孩子。 Popup的子女托管在PopupRoot内。你可以在Live Visual Tree看到它。

你可以看到下面的代码:

TextBlock text = new TextBlock(); 
text.Text = "Hello"; 
TextBlock text2 = new TextBlock(); 
text2.Text = "Hello world"; 
var objPopup = new Popup() 
{ 
    Child = text, 
    IsOpen = true 
}; 
var objPopup2 = new Popup() 
{ 
    Child = text2, 
    IsOpen = true 
}; 

enter image description here

从图片中,可以看到ButtonRootScrollViewerPopup的孩子们将在PopupRootPopup显示被展示。

如果要列举所有当前显示的弹出窗口,你可以添加Popup你可以使用foreach把所有的Popup的collection.That一种解决方法,那么你可以使用Popup.IsOpen知道是否显示在弹出窗口。

例如:

public ObservableCollection<Popup> popups; 

public MainPage() 
{ 
    this.InitializeComponent(); 

    TextBlock text = new TextBlock(); 
    text.Text = "Hello"; 
    TextBlock text2 = new TextBlock(); 
    text2.Text = "Hello world"; 
    var objPopup = new Popup() 
    { 
     Child = text, 
     IsOpen = true 
    }; 
    var objPopup2 = new Popup() 
    { 
     Child = text2, 
     IsOpen = true 
    }; 
    objPopup.HorizontalOffset = 100; 
    objPopup2.HorizontalOffset = 600; 
    popups = new ObservableCollection<Popup>(); 
    popups.Add(objPopup); 
    popups.Add(objPopup); 
    foreach (var item in popups) 
    { 
     if (item.IsOpen == false) 
     { 
      item.IsOpen = true; 
     } 
    } 
} 
0

可以使用VisualTreeHelper类,特别是GetOpenPopups方法。

使用它应该很容易。试试这样的:

var listOfOpenPopups = VisualTreeHelper.GetOpenPopups(Window.Current); 
相关问题