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?
2 ответа
Чтобы потерять Фокус, другими словами, чтобы получить Фокус внутри содержимого вкладки (цель):
- Фокусируемость цели установлена как истинная
- Цель должна быть поражена проверяемой. Фон цели не должен быть нулевым.
Добавьте обработчик события в событие 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(); }
Чтобы потерять фокус, элемент должен сначала иметь фокус. Возможно, альтернативой может стать фокусировка вашего элемента в соответствующем месте, когда ваши элементы инициализируются, например:
+ Изменить
<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 - хороший ресурс, также важно различать фокус клавиатуры и логический фокус!