如何自动选择焦点在WPF文本框中的所有文本?

如果我从GotFocus事件处理程序中调用SelectAll ,则它不适用于鼠标 - 只要释放鼠标,选择就会消失。

编辑:人们喜欢Donnelle的回答,我会尽力解释为什么我不喜欢它接受的答案。

  • 它比较复杂,而被接受的答案以更简单的方式做同样的事情。
  • 接受答案的可用性更好。 当您在文本中间单击时,释放鼠标时会取消选择文本以允许您立即开始编辑,如果您仍然想要全部选择,只需再次按下该按钮,这次它不会在释放时取消选择。 遵循Donelle的配方,如果我点击文字中间,我必须点击第二次才能编辑。 如果我在文本内部与文本之外的地方单击,这很可能意味着我要开始编辑而不是覆盖所有内容。

  • 不知道为什么它在GotFocus活动中失去了选择。

    但一种解决方案是在GotKeyboardFocus和GotMouseCapture事件上进行选择。 这样它会一直工作。


    我们拥有它,所以第一次点击全部选中,另一次点击进入光标(我们的应用程序设计用于带有笔的平板电脑)。

    你可能会觉得它很有用。

    public class ClickSelectTextBox : TextBox
    {
        public ClickSelectTextBox()
        {
            AddHandler(PreviewMouseLeftButtonDownEvent, 
              new MouseButtonEventHandler(SelectivelyIgnoreMouseButton), true);
            AddHandler(GotKeyboardFocusEvent, 
              new RoutedEventHandler(SelectAllText), true);
            AddHandler(MouseDoubleClickEvent, 
              new RoutedEventHandler(SelectAllText), true);
        }
    
        private static void SelectivelyIgnoreMouseButton(object sender, 
                                                         MouseButtonEventArgs e)
        {
            // Find the TextBox
            DependencyObject parent = e.OriginalSource as UIElement;
            while (parent != null && !(parent is TextBox))
                parent = VisualTreeHelper.GetParent(parent);
    
            if (parent != null)
            {
                var textBox = (TextBox)parent;
                if (!textBox.IsKeyboardFocusWithin)
                {
                    // If the text box is not yet focussed, give it the focus and
                    // stop further processing of this click event.
                    textBox.Focus();
                    e.Handled = true;
                }
            }
        }
    
        private static void SelectAllText(object sender, RoutedEventArgs e)
        {
            var textBox = e.OriginalSource as TextBox;
            if (textBox != null)
                textBox.SelectAll();
        }
    }
    

    Donnelle的答案是最好的,但不得不派上一个新班级来使用它是一件痛苦的事情。

    而不是我在App.xaml.cs中为应用程序中的所有TextBox注册处理程序。 这允许我使用标准TextBox控件的Donnelle答案。

    将以下方法添加到您的App.xaml.cs中:

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e) 
        {
            // Select the text in a TextBox when it receives focus.
            EventManager.RegisterClassHandler(typeof(TextBox), TextBox.PreviewMouseLeftButtonDownEvent,
                new MouseButtonEventHandler(SelectivelyIgnoreMouseButton));
            EventManager.RegisterClassHandler(typeof(TextBox), TextBox.GotKeyboardFocusEvent, 
                new RoutedEventHandler(SelectAllText));
            EventManager.RegisterClassHandler(typeof(TextBox), TextBox.MouseDoubleClickEvent,
                new RoutedEventHandler(SelectAllText));
            base.OnStartup(e); 
        }
    
        void SelectivelyIgnoreMouseButton(object sender, MouseButtonEventArgs e)
        {
            // Find the TextBox
            DependencyObject parent = e.OriginalSource as UIElement;
            while (parent != null && !(parent is TextBox))
                parent = VisualTreeHelper.GetParent(parent);
    
            if (parent != null)
            {
                var textBox = (TextBox)parent;
                if (!textBox.IsKeyboardFocusWithin)
                {
                    // If the text box is not yet focused, give it the focus and
                    // stop further processing of this click event.
                    textBox.Focus();
                    e.Handled = true;
                }
            }
        }
    
        void SelectAllText(object sender, RoutedEventArgs e)
        {
            var textBox = e.OriginalSource as TextBox;
            if (textBox != null)
                textBox.SelectAll();
        }
    }
    
    链接地址: http://www.djcxy.com/p/50509.html

    上一篇: How to automatically select all text on focus in WPF TextBox?

    下一篇: Most efficient way to concatenate strings?