如何在失去焦点时关闭 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