WPF — всплывающее окно не закрывается при нажатии снаружи

#wpf #popup #focus

#wpf #всплывающее окно #фокус

Вопрос:

У меня есть пользовательский элемент управления, который использует шаблон элемента управления, как показано в приведенном ниже блоке кода. Мне нужно показывать всплывающее окно, когда пользователь левой кнопкой мыши нажимает на элемент управления. Как только он / она щелкает вне всплывающего окна, оно должно закрыться.
При MouseLeftButtonUp этом всплывающее окно отображается, однако остается открытым при нажатии вне всплывающего окна.
Пожалуйста, обратите внимание, что я установил фокус на элементе списка всплывающих окон, как только pop открывается с помощью behaviours:Focus

 <ControlTemplate x:Key="ControlWithPopup" TargetType="local:CustomizedControl">
                <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseLeftButtonUp">
                            <ei:ChangePropertyAction
                                PropertyName="IsDropDownOpen"
                                TargetObject="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"
                                Value="True" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <Grid>
                        <Popup
                            x:Name="Popup1"
                            Width="100"
                            MinWidth="80"
                            MaxHeight="300"
                            AllowsTransparency="true"
                            IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=TwoWay}"
                            Placement="Center"
                            PlacementTarget="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"
                            PopupAnimation="Fade"
                            StaysOpen="False">
                            <Border
                                Background="{DynamicResource SomeBackgroundBrush}"
                                BorderBrush="{DynamicResource SomeBorderBrush}"
                                BorderThickness="1"
                                TextElement.Foreground="{DynamicResource SomeFontBrush}">
                                <ListBox
                                    x:Name="List1"
                                    ItemTemplate="{TemplateBinding DropDownTemplate}"
                                    ItemsSource="{Binding Path=ListSource, RelativeSource={RelativeSource Mode=TemplatedParent}}"
                                    ScrollViewer.CanContentScroll="False"
                                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                                    SelectedItem="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=TwoWay}"
                                    Style="{DynamicResource ListBoxNormalStyle}"
                                    VirtualizingPanel.IsVirtualizing="False">
                                </ListBox>
                            </Border>
                            <i:Interaction.Triggers>
                                <ei:DataTrigger Binding="{Binding IsOpen, ElementName=Popup1}" Value="True">
                                    <behaviours:ScrollIntoCenterView TargetObject="{Binding ElementName=List1}" />
                                    <behaviours:Focus TargetObject="{Binding ElementName=List1}" />
                                </ei:DataTrigger>
                            </i:Interaction.Triggers>
                        </Popup>
                        <Border
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch"
                            Background="Transparent"
                            BorderThickness="1">
                            <TextBlock
                                x:Name="Presenter"
                                HorizontalAlignment="Center"
                                VerticalAlignment="Center"
                                FontSize="11"
                                FontWeight="ExtraBold"
                                Text="{Binding SelectedValue}" />
                        </Border>
                    </Grid>
                </Border>
            </ControlTemplate>
 

Примечание —
— Также обратите внимание, я не хочу устанавливать StayOpen значение True по какой-то причине, выходящей за рамки проблемы. Я хочу добиться этого, используя StayOpen значение False

Комментарии:

1. Рассматривали ли вы возможность использования contextmenu вместо всплывающего окна? Потому что щелчок в любом месте за пределами contextmenu закроет его.

2. Я не хочу использовать контекстное меню, поскольку этот элемент управления присутствует в общей библиотеке и может повлиять на многие проекты, использующие его. Я просто пытаюсь расширить его функциональность.