1

「SelectAllOnFocus」という添付プロパティがあります。true/false の値。

    public static class TextBoxProps
    {
        private static void MyTextBoxKeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
            {
                ((TextBox)sender).Text = string.Empty;
            }
        }

        public static void SetSelectAllOnFocus(DependencyObject dependencyObject, bool     selectAllOnFocus)
        {
            if (!ReferenceEquals(null, dependencyObject))
            {
                dependencyObject.SetValue(SelectAllOnFocus, selectAllOnFocus);
            }
    }

    public static bool GetSelectAllOnFocus(DependencyObject dependencyObject)
    {
        if (!ReferenceEquals(null, dependencyObject))
        {
            return (bool)dependencyObject.GetValue(SelectAllOnFocus);
        }
        else
        {
            return false;
        }
    }

    private static void OnSelectAllOnFocus(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        bool selectAllOnFocus = (bool)e.NewValue == true;
        var theTextBox = d as TextBox;

        if (selectAllOnFocus && theTextBox != null)
        {
            theTextBox.PreviewMouseDown -= MyTextBoxMouseEnter; theTextBox.PreviewMouseDown += MyTextBoxMouseEnter;
        }
    }

    private static void MyTextBoxMouseEnter(object sender, MouseEventArgs e)
    {
        ((TextBox)sender).SelectAll();
        e.Handled = false;
    }


    public static readonly DependencyProperty SelectAllOnFocus
       = DependencyProperty.RegisterAttached("SelectAllOnFocus", typeof(bool), typeof(TextBoxEscapeProperty),
            new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnSelectAllOnFocus)));
}

何が起こるかは次のとおりです。

  1. PreviewMouseDown イベントがトリガーされます。
  2. MyTextBoxMouseEnter メソッドが呼び出されます。
  3. SelectAll() メソッドが呼び出されます。
  4. ((TextBox)sender).SelectedText で「監視」を行うと、値は正しいです (つまり、テキスト ボックスにあるものはすべて selectedText として表示されます)。
  5. テキストボックス自体は変更されていません。テキストが選択されていません。

これは一般的な WPF スタイルの一部です。アプリケーション内のすべてのテキスト ボックスは、このプロパティとそれに関連する動作を受け取る必要があります。

私は困惑しています。何か案は?

ありがとう

4

1 に答える 1

0

((TextBox)sender).UpdateLayout(); を呼び出すとどうなりますか? SelectAll コマンドの直後?あるいは、キーボードフォーカスをテキスト ボックスに設定する必要があるかもしれません。

テキストボックスがマウスまたはキーボードで選択されている場合に機能する、このようなものを使用する方が良いオプションかもしれません. (「SelectAllOnFocus」プロパティを確認するには、それを変更する必要があります)

App.xaml.cs で

    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();
    }
于 2012-09-07T14:40:34.420 に答える