2

我的标题上有带有 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 事件。单击选项卡项目内容区域不会触发失去焦点事件。

当用户单击文本框外的任何区域时,如何使文本框失去焦点?

4

2 回答 2

3

失去焦点,换句话说,在标签内容(目标)内部获得焦点:

  1. 目标的focusable设置为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();
    }
    
于 2011-10-26T06:59:05.720 回答
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是一个很好的资源,区分键盘焦点和逻辑焦点也很重要!

于 2011-10-26T05:58:35.317 回答