我的标题上有带TextBox的tabItems。我使用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;
}
如果只是单击TextBox外部的TabItem标题区域或单独的TabItem,则会发生LostFocus事件。 单击选项卡项内容区域不会触发丢失的焦点事件。
当用户单击TextBox外的任何区域时,如何使TextBox失去焦点?
答案 0 :(得分:3)
失去焦点,换句话说,将焦点放在标签内容(目标)内:
将事件处理程序添加到PreviewMouseDown事件(注意:NOT 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 :(得分:1)
要丢失焦点,元素必须首先拥有焦点。也许另一种方法是在元素初始化时将元素集中在适当的位置,例如:
更改
<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上的Focus Overview是一个很好的资源,区分键盘焦点和逻辑焦点也很重要!