Как «форматировать» значения текстового поля в WPF - PullRequest
0 голосов
/ 09 ноября 2011

Есть ли простой способ, чтобы текстовое поле отображало формат в текстовом поле и удаляло его при редактировании?

Пример: я хочу попросить денежную оценку. Когда пользователь закончил вводить значение 5,5, он отображает 5,00 $. Когда пользователь нажимает на текстовое поле, оно должно переключиться обратно на 5.5.

Спасибо.

Изменить: То, что я пытаюсь сделать, будет эквивалентно конвертеру, за исключением того, что для текстового поля не установлена ​​привязка.

1 Ответ

1 голос
/ 09 ноября 2011

Есть несколько решений для этого. Возможно, проще всего было бы реализовать пользовательское поведение (вам нужно будет сослаться на System.Windows.Interactivity.dll) и подключить некоторые события, предоставляемые TextBox, такие как GotFocus и LostFocus. Вот пример, который я сделал для выделения всего текста TextBox, когда он становится сфокусированным:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;

namespace TextBoxUtility
{
    public class TextBoxSelectAllOnFocusBehavior : Behavior<TextBox>
    {
        protected override void OnAttached()
        {
            base.OnAttached();

            this.AssociatedObject.PreviewMouseLeftButtonDown += OnPreviewMouseLeftButtonDown;
            this.AssociatedObject.GotKeyboardFocus += OnSelectAll;
            this.AssociatedObject.MouseDoubleClick += OnSelectAll;
        }

        protected override void OnDetaching()
        {
            this.AssociatedObject.PreviewMouseLeftButtonDown -= OnPreviewMouseLeftButtonDown;
            this.AssociatedObject.GotKeyboardFocus -= OnSelectAll;
            this.AssociatedObject.MouseDoubleClick -= OnSelectAll;
            base.OnDetaching();
        }

        private static void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var textbox = sender as TextBox;

            if (textbox != null && !textbox.IsKeyboardFocusWithin)
            {
                textbox.Focus();
                e.Handled = true;
            }
        }

        private static void OnSelectAll(object sender, RoutedEventArgs e)
        {
            var textbox = sender as TextBox;
            if (textbox != null)
            {
                textbox.SelectAll();
            }
        }

Редактировать: Забыл показать, как подключить поведение к TextBox. Чтобы присоединить Behavior, в вашем XAML вам нужно добавить ссылку на пространство имен в пространство имен вашего Behavior, а затем присоединить его как дочерний элемент разметки TextBox, например:

<TextBox Text="{Binding ....}">
    <i:Interaction.Behaviors>
        <utility:TextBoxSelectAllOnFocusBehavior />
    </i:Interaction.Behaviors>
</TextBox>

Вы могли бы сделать что-то подобное, хотя с вашим вы бы хотели подключиться к событиям, связанным с LostFocus, и настроить содержимое свойства Text TextBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...