如何在焦点丢失时关闭WPF Popup

时间:2015-03-04 10:03:36

标签: c# wpf treeview expander

从其他帖子的建议我已经定制了一个扩展器,所以在推送它时打开一个带有TreeView的Popup

除了一件事,一切都按预期工作。如果我在弹出窗口外单击它即使我已设置StaysOpen=False也没有关闭(我试图用文本块替换Tr​​eeView,但它仍然不起作用)

所以我所拥有的是ExpanderButton的ControlTemplate和扩展器的样式以及它的用法。

风格

<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 个答案:

答案 0 :(得分:2)

您将数据绑定到IsExpanded属性的Popup.IsOpen属性。通常,当我们想要在WPF中关闭Popup控件时,我们将数据绑定属性设置为false。但是,由于您将数据绑定到Expander.IsExpanded属性,因此您可以通过关闭Popup来关闭Expander

如果这不是您想要的行为,那么您可能应该将Popup.IsOpen属性数据绑定到另一个bool属性。然后,当您要关闭Popup时,只需将该属性设置为false