文本框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