Как заставить всплывающее окно WPF закрываться при потере фокуса
Из других постов я настроил экспандер так, чтобы при нажатии он открывал всплывающее окно с TreeView в
Все работает как положено, кроме одного. Если я нажимаю вне всплывающего окна, оно не закрывается, даже если я установил StaysOpen=False
(Я пытался заменить TreeView на текстовый блок, но он все еще не работает)
Итак, у меня есть ControlTemplate для ExpanderButton a Style для Expander и его использование.
Стиль
<Style x:Key="W8Expander" TargetType="{x:Type Expander}" >
<Setter Property="MinWidth" Value="120" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Expander}">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition x:Name="ContentRow" Height="0" />
</Grid.RowDefinitions>
<Border x:Name="Border" Grid.Row="0" BorderThickness="1" CornerRadius="2,2,0,0">
<Grid Background="{TemplateBinding Background}">
<ToggleButton x:Name="ExpanderButton" Template="{StaticResource W8ExpanderToggleButton}" Content="{TemplateBinding Header}"
IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" OverridesDefaultStyle="True" >
</ToggleButton>
</Grid>
</Border>
<Border x:Name="Content" Grid.Row="1">
<ContentPresenter Margin="0" />
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="ContentRow" Property="Height" Value="0" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Использование экспандера в xaml
<Expander Name="TreeViewExpander" Style="{StaticResource W8Expander}" Grid.Row="0" Grid.Column="0" Margin="10,0,10,0" >
<Expander.Header>
<StackPanel>
<TextBlock Text="{Binding Path=ActiveReportTypeCategory.Name}"/>
<TextBlock Text="{Binding Path=ActiveReportType.Name}" Style="{DynamicResource OptionValueTextStyle}" Margin="0,-1,0,0"/>
</StackPanel>
</Expander.Header>
<Popup Name="ReportSelectionPopoUp" IsOpen="{Binding IsExpanded, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}}" StaysOpen="False" Opened="ReportSelectionPopoUp_OnOpened" PopupAnimation="Fade" Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}}" >
<TextBlock>asdf</TextBlock>
</Popup>
</Expander>
При нажатии вне всплывающего окна, я ожидаю, что оно закрывается как StaysOpen=false
Однако этого не происходит. Это из-за Opened
обязательный? Любые предложения, как заставить это работать?
1 ответ
У вас есть данные, связанные с IsExpanded
собственность на Popup.IsOpen
имущество. Как правило, когда мы хотим закрыть Popup
управления в WPF, мы устанавливаем свойство привязки данных к false
, Однако, поскольку у вас есть данные, связывающие это свойство с Expander.IsExpanded
собственность, вы можете закрыть Popup
закрыв Expander
,
Если это не то поведение, которое вам нужно, то, возможно, вам следует связать данные Popup.IsOpen
собственность другому bool
собственность вместо Затем, когда вы хотите закрыть Popup
просто установите свойство false
,