Я довольно долго боролся с этим, и я не могу найти подходящее решение. Это сценарий снят. Представьте, у вас есть следующий код XAML:Закрытие всплывающего окна, когда его родитель обрушивается
<Grid x:Name="LayoutRoot" Background="White">
<Grid x:Name="Host" Width="200" Height="200">
<Popup IsOpen="True">
<Button Content="Some Button" Click="Button_Click" />
</Popup>
</Grid>
</Grid>
В обработчике событий Button_Click я все это разрушится сетки с именем хоста .
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Host.Visibility = System.Windows.Visibility.Collapsed;
}
То, что я ожидал, было то, что всплывающее окно закрыло бы, спрятав кнопку. Я понимаю, что всплывающие окна не совпадают с VisualTree, и я понимаю, почему это может не работать так, как я ожидаю, но должен быть какой-то механизм для этого, чтобы это произошло автоматически. Единственное обходное решение, которое приходит мне на ум, - это LayoutUpdated, чтобы пересечь визуальное дерево и спросить родителя каждой кнопки, если он виден, и если я встречаю свернутый родительский элемент -> закрыть всплывающее окно. Однако представьте себе, что удар производительности имеет ОГРОМНОЕ визуальное дерево. Это безумие, чтобы пересечь визуальное дерево на каждом макете. Я открыт для любых предложений.
EDIT: Кажется, что я не полностью объяснил свой сценарий. Дело в том, чтобы свернуть всплывающее окно, если ЛЮБОЙ его родителя получает рушится (а не только сразу). В WPF есть полезное свойство: IsVisible, который отличается от Visibility. Например, Видимость еще может быть Visible, но IsVisible будет в этом случае ложным.
С наилучшими пожеланиями, K
Моя основная цель - закрыть всплывающее окно, когда любой из его родителей рухнет. –
Хорошо, ладно, тогда мой ответ не то, что вам нужно. Насколько велико визуальное дерево (сколько пользовательских элементов управления «обертывает» всплывающее окно)? Вы добавили бы какой-то слушатель к каждому элементу обертывания, и если видимость изменится, вы можете выбросить событие или перейти в состояние ... Возможно, вы могли бы что-то сделать с поведением или состояниями ... – TerenceJackson