WPF TextBox с всплывающим - PullRequest
0 голосов
/ 17 мая 2018

Я работаю с WPF Popup.Всплывающее окно содержит некоторую клавиатуру.Я хочу открыть всплывающее окно, когда пользователь нажимает на текстовое поле, и не скрывать всплывающее окно, когда текстовое поле имеет фокус.Также мне нужно скрыть всплывающее окно, когда пользователь щелкает где-то далеко от всплывающего окна.Вот код xaml:

<Grid>
    <StackPanel>
        <TextBox  x:Name="textBox" GotKeyboardFocus="textBox_GotFocus" MouseDown="textBox_MouseDown" />

        <Popup x:Name="popup" Width="100" Height="100" PlacementTarget="{Binding ElementName=textBox}" Placement="Bottom"
        StaysOpen="{Binding ElementName=text,Path=IsKeyboardFocused}">
            <Grid Background="Blue">

            </Grid>
        </Popup>

    </StackPanel>
</Grid>

Вот код c #:

 private void textBox_GotFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            popup.IsOpen = true;
        }

private void textBox_MouseDown(object sender, MouseButtonEventArgs e)
        {
            popup.IsOpen = true;
        }

Я обнаружил, что привязка может помочь:

StaysOpen="{Binding ElementName=,Path=IsKeyboardFocused}" 

Но TextBox никогда не прячется,Также, если я установлю StaysOpen = "False", TextBox никогда не будет отображаться

1 Ответ

0 голосов
/ 17 мая 2018

Вы можете обработать событие LostKeyboardFocus и проверить, является ли новый сфокусированный элемент самим TextBox или дочерним элементом Popup:

private void textBox_GotFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    popup.IsOpen = true;
}

private void textBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    var newFocusedElement = e.NewFocus as DependencyObject;
    //if the focused element is a child of the window, it can't be the child of the popup
    if (newFocusedElement == null || FindParent<Window>(newFocusedElement) != null)
        popup.IsOpen = false;

}

private void popup_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    popup.IsOpen = e.NewFocus == textBox;
}

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

Образец XAML:

<StackPanel>
    <TextBox x:Name="textBox" GotKeyboardFocus="textBox_GotFocus" LostKeyboardFocus="textBox_LostKeyboardFocus" />

    <Popup x:Name="popup" Width="100" Height="100" PlacementTarget="{Binding ElementName=textBox}"
                   LostKeyboardFocus="popup_LostKeyboardFocus"
                   Placement="Bottom">
        <Grid x:Name="popupRoot" Background="Blue">
            <TextBox Margin="10" />
        </Grid>
    </Popup>

    <TextBox />

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