целочисленный формат строки wpf от 1234 до 12:34 только в XAML

У меня есть значение 1234, и я должен показать его как 0012:34, и когда пользователь нажимает на это текстовое поле, чтобы изменить значение, оно должно отображать только 1234, а при отключении вкладок оно должно вернуться к 0012:34. Если я использую конвертер, он не меняет формат при получении фокуса. У меня есть это текстовое поле внутри шаблона данных, и я также не могу получить к нему доступ в коде, что означает, что я не могу выполнить форматирование в событии Got_Focus. Кто-нибудь может помочь с форматированием, пожалуйста? Я могу использовать int или string в качестве типа данных.

Спасибо, Рози.


person Rosy    schedule 31.10.2012    source источник


Ответы (2)


Вы можете использовать WatermarkTextBox из Расширенный набор инструментов WPF:

<xctk:WatermarkTextBox Text="{Binding Value}" Watermark="{Binding Value, Mode=OneWay, Converter={StaticResource YourValueConverter}}" />
person SHSE    schedule 31.10.2012

В качестве альтернативы текстовому полю водяного знака вы можете использовать поведение.

System.Windows.Interactivity необходимо указать.

Пример:

Xaml:

<Window x:Class="WatermarkTextBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:WatermarkTextBox="clr-namespace:WatermarkTextBox" Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0" Width="300" Height="30">
            <i:Interaction.Behaviors>
                <WatermarkTextBox:WatermarkBehavior />
            </i:Interaction.Behaviors>
        </TextBox>
        <TextBox Grid.Row="1" Width="300" Height="30" />
    </Grid>
</Window>

Поведение:

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

namespace WatermarkTextBox
{
    public class WatermarkBehavior : Behavior<TextBox>
    {
        private string _value = string.Empty;

        protected override void OnAttached()
        {
            AssociatedObject.GotFocus += OnGotFocus;
            AssociatedObject.LostFocus += OnLostFocus;
        }

        protected override void OnDetaching()
        {
            AssociatedObject.GotFocus -= OnGotFocus;
            AssociatedObject.LostFocus -= OnLostFocus;
        }

        private void OnGotFocus(object sender, RoutedEventArgs e)
        {
            AssociatedObject.Text = _value;
        }

        private void OnLostFocus(object sender, RoutedEventArgs e)
        {
            _value = AssociatedObject.Text;
            AssociatedObject.Text = string.Format("Watermark format for: {0}", _value);
        }
    }
}
person menty    schedule 31.10.2012