2016-04-06 3 views
0

私たちのコードには、親に接続されていないポップアップウィンドウを表示する場所がたくさんあります。言い換えれば、それはすべてのポップアップウィンドウを列挙するには?

です。同時に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

を、あなたはButtonRootScrollViewerであるとPopupの子供たちがPopupRootPopupに表示されます見ることができます表示されています。

あなたはすべての現在表示されているポップアップを列挙したい場合は、回避策としてあなたは、あなたがポップアップが表示されているかどうかを知るためにPopup.IsOpenを使用することができ、あなたがPopupのすべてを取得するためにforeachを使用することができますcollection.ThatにPopupを追加することができます。例えば

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);