如何在失去焦点时关闭 WPF 弹出窗口
How to get a WPF Popup to close when focus is lost
根据其他 post 的建议,我定制了一个扩展器,因此在推送时它会在
中打开一个带有 TreeView 的弹出窗口
除一件事外,一切都按预期进行。如果我在弹出窗口外单击它不会关闭,即使我设置了 StaysOpen=False
(我试图用文本块替换 TreeView,但它仍然不起作用)
所以我有一个用于 ExpanderButton 的 ControlTemplate 一个用于 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
绑定吗?
有什么建议可以让它发挥作用吗?
您已将 IsExpanded
属性 的数据绑定到 Popup.IsOpen
属性。通常,当我们想要在 WPF 中关闭一个 Popup
控件时,我们将数据绑定 属性 设置为 false
。但是,由于您有数据将 属性 绑定到 Expander.IsExpanded
属性,您可以通过关闭 Expander
.
来关闭 Popup
如果这不是您想要的行为,那么也许您应该将 Popup.IsOpen
属性 数据绑定到另一个 bool
属性。然后,当您想要关闭 Popup
时,只需将 属性 设置为 false
。
根据其他 post 的建议,我定制了一个扩展器,因此在推送时它会在
中打开一个带有 TreeView 的弹出窗口除一件事外,一切都按预期进行。如果我在弹出窗口外单击它不会关闭,即使我设置了 StaysOpen=False
(我试图用文本块替换 TreeView,但它仍然不起作用)
所以我有一个用于 ExpanderButton 的 ControlTemplate 一个用于 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
绑定吗?
有什么建议可以让它发挥作用吗?
您已将 IsExpanded
属性 的数据绑定到 Popup.IsOpen
属性。通常,当我们想要在 WPF 中关闭一个 Popup
控件时,我们将数据绑定 属性 设置为 false
。但是,由于您有数据将 属性 绑定到 Expander.IsExpanded
属性,您可以通过关闭 Expander
.
Popup
如果这不是您想要的行为,那么也许您应该将 Popup.IsOpen
属性 数据绑定到另一个 bool
属性。然后,当您想要关闭 Popup
时,只需将 属性 设置为 false
。