Я уже давно борюсь с этим и, похоже, не могу найти правильного решения.Это сценарий урезанный.Представьте, что у вас есть следующий 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 все, что я делаю, это сворачиваю сетку с именем Host .
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Host.Visibility = System.Windows.Visibility.Collapsed;
}
Чего я ожидал, так это того, что всплывающее окно закроется, поэтому сокрыт кнопку.Я понимаю, что всплывающие окна не находятся в том же VisualTree, и я понимаю, почему это может работать не так, как я ожидаю, но должен быть какой-то механизм, чтобы это происходило автоматически.Единственный обходной путь, который мне приходит в голову, - это LayoutUpdated, чтобы пройти вверх по визуальному дереву и спросить каждого родителя Button, если он видим, и если я встретил свернутого родителя -> закройте Popup.Однако представьте, что хит производительности имеет ОГРОМНОЕ визуальное дерево.Безумно обходить визуальное дерево на каждом проходе макета.Я открыт для любых предложений.
РЕДАКТИРОВАТЬ: Кажется, я не объяснил полностью мой сценарий.Дело в том, чтобы свернуть всплывающее окно, если ЛЮБОЙ его родителя свернут (а не только непосредственный).В WPF есть полезное свойство под названием IsVisible , которое отличается от Visibility.Например, Visibility все еще может быть Visible , но IsVisible будет false в этом сценарии.
С наилучшими пожеланиями, K