2011-10-26 156 views
2

我有他们的标题上带有TextBox的tabItems。我使用LostFocus和MouseDoubleClick事件将文本设置为TextBox。WPF TabItem失去焦点事件

<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标题区域或enother TabItem,就会发生LostFocus事件。 单击标签项目内容区域不会触发丢失的焦点事件。

如何在用户单击TextBox外部的任何区域时使TextBox失去焦点?

回答

3

要失去重心,在其他的词来获得焦点在内部标签的内容(目标):

目标
  1. 调焦设置为真
  2. 目标应打测试。目标的背景不应该为空。
  3. 将事件处理程序添加到PreviewMouseDown事件(NOTE: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

失重重点,一个元素必须首先重点。也许是另一种可能是给你的元素焦点在适当的地方,当你的元素被初始化,例如:

变化

<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); 
... 

Focus Overview在MSDN上是一个很好的资源,区分键盘焦点和逻辑焦点也很重要!