文本框SelectAll选项卡上,而不是鼠标单击

因此,假设我有一个带有几个文本框的WPF表单,如果您选中该文本框并且它已经包含某些内容,那么我想选择该框中的所有文本,以便键入将删除该文本。 如果你用鼠标点击该框,这可能意味着你想在某处更改一个字母,所以在这种情况下不要突出显示所有字母。 看起来很简单,但是迄今为止,我还是一个很好的解决方案。 这是我迄今为止的工作非常接近,但并不完美。

<Style x:Key="TextBoxStyle" TargetType="TextBox">
    <EventSetter Event="GotKeyboardFocus" Handler="EventSetter_OnHandler" />
</Style>

private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
{
    TextBox txt = sender as TextBox;
    if (txt != null) txt.SelectAll();
}

所以当箱子获得键盘焦点时,它会选择全部,因此标签到文本框会完美地选择所有文本。 但是,如果鼠标单击此方法也会被调用,这也会突出显示文本,但点击会将光标放在鼠标点击后的位置。 所以在功能上它是完美的,但它仍然困扰我,当鼠标点击时它会闪烁选择所有内容。 任何更好的方法来做到这一点,或者在我的活动中进行某种检查,以便知道我通过鼠标单击而不是制表符获得了键盘焦点?


至今还没有看到任何干净的解决方案,你可以做的一件事就是检查鼠标状态:

var tb = (TextBox)sender;
if (Mouse.LeftButton != MouseButtonState.Pressed)
    tb.SelectAll();

但实际上有更好的方法,因为焦点转移到键可以检查键盘。 我建议使用GotKeyboardFocus处理程序的正确签名来获取适当的事件参数:

private void TextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    if (e.KeyboardDevice.IsKeyDown(Key.Tab))
        ((TextBox)sender).SelectAll();
}

在这一点上,你仍然可以看到一些选择被点击清除,但这只是因为如果未聚焦,以前的选择只会被隐藏。 您可以始终清除LostKeyboardFocus的选择以防止该选择(例如((TextBox)sender).Select(0, 0) )。


当焦点事件发生时,您可以尝试检查鼠标是否出现在文本框中,并检查鼠标ButtonButtonState。 这并不完美,但应该接近你正在寻找的东西。

private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
{
    TextBox txt = sender as TextBox;
    Point position = Mouse.GetPosition(txt);
    // if Mouse position is not in the TextBox Client Rectangle
    // and Mouse Button not Pressed.
    if((!(new Rect(0,0,txt.Width,txt.Height)).Contains(position)) || ( Mouse.LeftButton != MouseButtonState.Pressed))
        if (txt != null) txt.SelectAll();
}

和HB指出你可以尝试使用txt.IsMouseOver属性来确定光标是否在TextBox的客户端矩形内。 它看起来很干净。

private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
{
    TextBox txt = sender as TextBox;
    if( !txt.IsMouseOver || Mouse.LeftButton != MouseButtonState.Pressed)
        if (txt != null) txt.SelectAll();
}

你可以捕捉到最后一个按键,并在你的事件中与它比较

private Key lastKey;
protected override void OnKeyDown(KeyEventArgs e)
{
     lastKey = e.Key;
     base.OnKeyDown(e);
}

并在您的活动中:

private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
{
    if(lastKey != Key.Tab)
        return;

    TextBox txt = sender as TextBox;
    if (txt != null) txt.SelectAll();
}

这并不完美,因为它们可能会触发选项卡(而不是控制),而不是点击进入控制。 但它大部分时间都会工作。

链接地址: http://www.djcxy.com/p/44931.html

上一篇: Textbox SelectAll on tab but not mouse click

下一篇: With what keys can a user leave a WPF TextBox?