WPF TabItem失去焦点事件

时间:2011-10-26 05:19:53

标签: wpf tabcontrol tabitem lost-focus lostfocus

我的标题上有带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失去焦点?

2 个答案:

答案 0 :(得分:3)

失去焦点,换句话说,将焦点放在标签内容(目标)内:

  1. 目标的可聚焦设置为true
  2. 目标应该是可测试的。目标的背景不应为空。
  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是一个很好的资源,区分键盘焦点和逻辑焦点也很重要!