Событие потери фокуса WPF TabItem

У меня есть tabItems с TextBox в заголовках. Я использую события LostFocus и MouseDoubleClick, чтобы установить текст в TextBox.

<TabControl>
                <TabItem Width="50">
                    <TabItem.Header>
                        <TextBox Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/>
                    </TabItem.Header>
                </TabItem>
</TabControl>

    private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        TextBox text_box = sender as TextBox;
        if (text_box == null) { return; }

        text_box.IsReadOnly = false;
        text_box.SelectAll();
    }

    private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        TextBox text_box = sender as TextBox;
        if (text_box == null) { return; }

        text_box.IsReadOnly = true;
    }

Событие LostFocus происходит, если вы нажимаете только область заголовка TabItem за пределами TextBox или на другом TabItem. Щелчок по области содержимого элемента вкладки не вызывает событие потери фокуса.

Как заставить TextBox терять фокус, когда пользователь щелкает любую область за пределами TextBox?


person Diana    schedule 26.10.2011    source источник


Ответы (2)


Чтобы потерять фокус, другими словами, чтобы получить фокус внутри содержимого вкладки (цель):

  1. Фокусируемость цели установлена ​​как истинная
  2. Цель должна быть проверена на попадание. Фон цели не должен быть нулевым.
  3. Добавьте обработчик событий в событие PreviewMouseDown (ПРИМЕЧАНИЕ: НЕ MouseDown), чтобы реагировать на щелчок мышью. Если вы исключите 3 шага, ваше приложение будет реагировать только на клавишу TAB.

    <TabControl>
        <TabItem Width="50">
            <TabItem.Header>
                <TextBox 
                    Text="text" IsReadOnly="True" 
                    LostFocus="TextBox_LostFocus"
                    MouseDoubleClick="TextBox_MouseDoubleClick"/>
            </TabItem.Header>
            <Border Focusable="True" Background="Transparent" PreviewMouseDown="Border_PreviewMouseDown"/>
        </TabItem>
    </TabControl>
    
    
    private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var uiElement = sender as UIElement;
        if (uiElement != null) uiElement.Focus();
    }
    
person Jin-Wook Chung    schedule 26.10.2011

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

Изменять

<TextBox Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/>

To

<TextBox x:Name="MyTextBox" Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/>

И в вашем конструкторе используйте FocusManager, чтобы установить элемент с фокусом:

...
FocusManager.SetFocusedElement(MyTextBox.Parent, MyTextBox);
...

Обзор фокусировки на MSDN - хороший ресурс, также важно различать между фокусом клавиатуры и логическим фокусом!

person Tobbe    schedule 26.10.2011