[WPF] Как закрыть всплывающее окно - PullRequest
0 голосов
/ 07 мая 2020

Я хотел бы автоматически закрыть всплывающее окно, управляя значением 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;
   }
}

Когда текст вводится в текстовое поле с параметром IsOpen всплывающего окна, равным true, можно автоматически закрыть всплывающее окно при щелчке за пределами элемента управления. Но в состоянии вызова функции textBox_PreviewMouseLeftButtonUp с такими же ситуациями она не будет закрыта автоматически (также IsOpen истинно)

Если я перейду на e.handel = true в textBox_PreviewMouseLeftButtonUp, то может быть закрыт автоматически , щелкнув за его пределами. Но у него есть серьезная проблема, он не может выбрать какой-либо элемент управления во всплывающем окне. так что нельзя использовать этот способ.

Как безопасно закрыть всплывающее окно автоматически, щелкнув за пределами элемента управления?

Ответы [ 2 ]

0 голосов
/ 07 июня 2020

Не идеально, но я решил.
Я добавил MouseLeftButtonUpEvent вместо PreviewMouseLeftButtonUp.

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

При нажатии внешнего элемента управления всплывающее окно закрывается автоматически, а при нажатии TextBox открывается всплывающее окно.
Однако, если отображается всплывающее окно, при нажатии TextBox открывается всплывающее окно не скрыт.

В любом случае, думаю, этого достаточно.

0 голосов
/ 07 мая 2020

Вы можете использовать событие TextBox LostKeyboardFocus, которое срабатывает, когда TextBox больше не является местом назначения для ввода с клавиатуры (т. Е. Когда пользователь щелкает или переходит от элемента управления ).

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

Кроме того, для открытия всплывающего окна я могу порекомендовать использовать GotKeyboardFocus. PreviewMouseLeftButtonUp будет работать, только если пользователь установит фокус, щелкнув левой кнопкой мыши, но пользователь также может использовать вкладку и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...