WPF TabItem потерял фокус событие - PullRequest
2 голосов
/ 26 октября 2011

У меня есть 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?

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

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

  1. Фокусируемость цели установлена ​​в true
  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();
    }
    
1 голос
/ 26 октября 2011

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

Изменить

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

На

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

Ив вашем конструкторе используйте FocusManager для установки сфокусированного элемента:

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

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

...