[WPF]如何关闭弹窗

[WPF]How to close popup

我想通过控制 StaysOpen 值自动关闭弹出窗口 属性。每当输入文本或单击鼠标左键时,我都会打开它。
StaysOpen 设置为 false

    <Grid>
        <TextBox x:Name="textBox" PreviewMouseLeftButtonUp="textBox_PreviewMouseLeftButtonUp"/>
        <Popup IsOpen="{Binding IsOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" OpacityMask="Transparent" StaysOpen="{Binding StaysOpen, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
               AllowsTransparency="True" PlacementTarget="{Binding ElementName=textBox}">
            <Border CornerRadius="5" Background="#FF303030" Width="{Binding ActualWidth, ElementName=textBox}">
                ...
            </Border>
        </Popup>
    </Grid>
private void textBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
   if ((sender as TextBox).Text.Length > 0)
   {
      IsOpen = !IsOpen;
   }
}

当在文本框中输入文本且 Popup 的 IsOpen 为 true 时,可以在控件外边单击时自动关闭弹出窗口。但是,在 textBox_PreviewMouseLeftButtonUp 相同情况下的函数调用状态下,不会自动关闭它。(IsOpen 也为真)

如果我在textBox_PreviewMouseLeftButtonUp中更改为e.handel = true,则可以通过单击它的外部自动关闭。但是它有严重的问题,不能选择弹出窗口中的任何控件。所以不能用这种方式。

如何通过单击控件的一侧来安全地自动关闭弹出窗口?

您可以使用 TextBoxLostKeyboardFocus 事件,当 TextBox 不再是键盘输入的目标时(即当用户单击或离开控制)。

private void textBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    IsOpen = false;
}

此外,对于打开弹出窗口,我可能建议使用 GotKeyboardFocusPreviewMouseLeftButtonUp 仅当用户通过左键单击设置焦点时才有效,但用户也可以使用 Tab 等方式

不完美,但我解决了。
我添加了 MouseLeftButtonUpEvent 而不是 PreviewMouseLeftButtonUp。

textBox.AddHandler(MouseLeftButtonUpEvent,
                               new RoutedEventHandler(textBox_MouseLeftButtonUp),
                               true);

点击外部控件时,弹窗自动关闭,点击TextBox时,弹窗自动打开
但是,如果显示 Pop up,则单击 TextBox 时,Pop up 不会隐藏。

反正我觉得够了