2015-02-21 2 views
2

Я новичок в WPF. У меня есть требование, что мне нужно разработать пользовательский элемент управления текстового поля, которые должны поддерживать функциональность, как:WPF Custom TextBox с десятичным форматированием

  1. Если принимать только десятичные значения.

  2. Должен округлить до трех знаков после запятой, если присвоено значение через код или пользователем.

  3. Должен показать полное значение (без форматирования) по фокусу.

Например:

Если 2,21457 присваивается текстовое поле (по коду или пользователем), он должен отображать 2.215. Когда пользователь нажимает на него для редактирования, он должен показывать полное значение 2.21457. После того, как пользователь отредактирует значение до 5.42235 и выберет его, он должен снова округлить до 5.422.

Пробовал это без успеха. Так что нужна помощь. Заранее спасибо за помощь.

Благодаря

ответ

1

Я написал пользовательский элемент управления, который будет иметь зависимость свойства ActualText. Свяжите свое значение с этим свойством ActualText и обработайте свойство Text текстового поля во время события gotfocus и lostfocus. Также проверяется на десятичное число в событии PreviewTextInput. см. приведенный ниже код.

class TextBoxEx:TextBox 
{ 
    public string ActualText 
    { 
     get { return (string)GetValue(ActualTextProperty); } 
     set { SetValue(ActualTextProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ActualText. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ActualTextProperty = 
     DependencyProperty.Register("ActualText", typeof(string), typeof(TextBoxEx), new PropertyMetadata(string.Empty, OnActualTextChanged)); 

    private static void OnActualTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     TextBox tx = d as TextBox; 
     tx.Text = (string)e.NewValue; 
     string str = tx.Text;    
     double dbl = Convert.ToDouble(str); 
     str = string.Format("{0:0.###}", dbl); 
     tx.Text = str; 
    } 

    public TextBoxEx() 
    { 
     this.GotFocus += TextBoxEx_GotFocus; 
     this.LostFocus += TextBoxEx_LostFocus; 
     this.PreviewTextInput += TextBoxEx_PreviewTextInput; 
    } 

    void TextBoxEx_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e) 
    { 
     decimal d; 
     if(!decimal.TryParse(e.Text,out d)) 
     { 
      e.Handled = true; 
     } 
    }   

    void TextBoxEx_LostFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     ConvertText(); 
    } 

    void TextBoxEx_GotFocus(object sender, System.Windows.RoutedEventArgs e) 
    { 
     this.Text = ActualText; 
    } 

    private void ConvertText() 
    { 
     string str = this.Text; 
     ActualText = str; 
     double dbl = Convert.ToDouble(str); 
     str = string.Format("{0:0.###}", dbl); 
     this.Text = str; 
    } 
} 
+0

Работает с некоторыми ухищрениями. Работа Gr8. Благодаря!! – hkfrnds23

Смежные вопросы