Как заставить всплывающее окно 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,

Другие вопросы по тегам