17

因此,假设我有一个带有多个文本框的 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();
}

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

4

5 回答 5

23

遗憾的是,到目前为止还没有看到任何干净的解决方案,您可以做的一件事就是检查鼠标状态:

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))。

于 2012-08-03T00:25:41.450 回答
1

您可以尝试在焦点事件发生时检查鼠标是否存在于文本框中,并检查鼠标按钮按钮状态。这并不完美,但应该接近您正在寻找的内容。

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 属性来确定光标是否在文本框的客户端矩形内。看起来干净了很多。

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();
}
于 2012-08-03T00:26:25.490 回答
0

可以捕获最后按下的键并在您的事件中与它进行比较

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();
}

这并不完美,因为他们可以点击标签(而不是标签进入您的控件)然后点击进入您的控件。但它会在大多数情况下工作。

于 2012-08-02T23:22:48.353 回答
0

您可以使用附加的行为模式

public class Behaviors
{
    public static readonly DependencyProperty SelectTextOnFocusProperty = DependencyProperty
        .RegisterAttached("SelectTextOnFocus", typeof(bool), typeof(Behaviors), new FrameworkPropertyMetadata(false, GotFocus));

    public static void SetSelectTextOnFocus(DependencyObject obj, bool value)
    {
        obj.SetValue(SelectTextOnFocusProperty, value);
    }

    private static void GotFocus(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var textbox = d as TextBox;

        if (null == textbox) return;

        textbox.GotKeyboardFocus += SelectTextOnFocus;
        textbox.GotMouseCapture += SelectTextOnFocus;
    }

    private static void SelectTextOnFocus(object sender, RoutedEventArgs e)
    {
        if (!(sender is TextBox)) return;
        ((TextBox)sender).SelectAll();
    }
}

在您的 xaml 中只需要

xmlns:my="clr-namespace:Namespace;assembly=Rkmax"

使用您可以在 TextBox 中使用

<TextBox my:Behaviors.SelectTextOnFocus="True" />

所有这些都适用于鼠标和键盘事件

于 2012-08-03T00:33:13.860 回答
0

我搜索了很多解决方案,我找到了几个 selectall 的解决方案但是,问题是当我们在从文本框中选择部分文本后右键单击并进行剪切/复制时,即使我选择了部分文本,它也会选择全部。在这里解决这个问题是解决方案。只需在键盘选择事件中添加以下代码。这对我有用。

    private static void SelectContentsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is TextBox)
        {
            TextBox textBox = d as TextBox;
            if ((e.NewValue as bool?).GetValueOrDefault(false))
            {
                textBox.GotKeyboardFocus += OnKeyboardFocusSelectText;                 
            }
            else
            {
                textBox.GotKeyboardFocus -= OnKeyboardFocusSelectText;

            }
        }
    }


    private static void OnKeyboardFocusSelectText(object sender, KeyboardFocusChangedEventArgs e)
    {
        if (e.KeyboardDevice.IsKeyDown(Key.Tab))
            ((TextBox)sender).SelectAll();
    }
于 2017-01-23T19:35:18.670 回答