2014-11-11 4 views
5

मैंने दशमलव मान रखने के लिए सरल WPF कस्टम टेक्स्टबॉक्स नियंत्रण लिखा है। इधर, एक बहुत "प्रकाश" अपने कोड का संस्करण है तरीकों और गुण का सबसे बिना (लेकिन यह परीक्षण के लिए पर्याप्त होना चाहिए):स्वरूपण के बाद अजीब टेक्स्टबॉक्स कैरेट व्यवहार

using System; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 

namespace CustomControls 
{ 
    public class NumericBox : TextBox 
    { 
     public static readonly DependencyProperty ValueProperty; 
     public static readonly DependencyProperty DecimalCountProperty; 

     static NumericBox() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericBox), new FrameworkPropertyMetadata(typeof(NumericBox))); 
      ValueProperty = DependencyProperty.Register("Value", typeof (decimal?), typeof (NumericBox), 
       new FrameworkPropertyMetadata(0m, OnValueChanged)); 
      DecimalCountProperty = DependencyProperty.Register("DecimalCount", typeof(int), typeof(NumericBox), 
       new FrameworkPropertyMetadata(2, OnDecimalCountChanged)); 

     } 
     public int DecimalCount 
     { 
      get { return (int)GetValue(DecimalCountProperty); } 
      set { SetValue(DecimalCountProperty, value); } 
     } 
     public decimal? Value 
     { 
      get { return (decimal?)GetValue(ValueProperty); } 
      set { SetValue(ValueProperty, value); } 
     } 
     private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
     } 
     private static void OnDecimalCountChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
     } 
     public override void OnApplyTemplate() 
     { 
      base.OnApplyTemplate(); 
      BindingOperations.ClearAllBindings(this); 
      var textBinding = new Binding("Value") 
      { 
       Converter = new TextToNumericBoxValueConverter(), 
       Mode = BindingMode.TwoWay, 
       UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, 
       RelativeSource = new RelativeSource(RelativeSourceMode.Self), 
       ConverterParameter = DecimalCount 
      }; 
      SetBinding(TextProperty, textBinding); 
     } 
    } 

    public class TextToNumericBoxValueConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var d = value as decimal?; 
      if (d == null) return ""; 
      var p = parameter is int ? (int)parameter : 0; 
      var nf = culture.NumberFormat.Clone() as NumberFormatInfo; 
      if (nf == null) return ""; 
      nf.NumberDecimalDigits = p; 
      return d.Value.ToString("N", nf); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      decimal d; 
      var s = value as string; 
      if (s == null) 
       return null; 
      if (decimal.TryParse(s, out d)) 
       return d; 
      return null; 
     } 
    } 
} 

और अब विषमता शुरू होता है। यदि मैं उत्तराधिकार में कई समान संख्या टाइप करता हूं, तो 10-वें संख्या टाइप होने तक सब कुछ ठीक है। फिर कैरेट 5 वें स्थान पर कूदता है। और यह 2 दशमलव अंकों के मामले में है। कहने के मामले में, 11-वें कीस्ट्रोक के बाद 6-वें स्थान पर कैरेट कूदता है, तो 3 दशमलव अंक। यदि मैं अलग-अलग संख्या टाइप करता हूं, तो कैरेट टेक्स्ट के अंत तक कूद जाता है। यदि प्रारूप में कोई दशमलव अंक नहीं है - सबकुछ ठीक काम करता है। मैंने बिना प्रारूप के प्रारूप को मैन्युअल रूप से सेट करने का प्रयास किया है। caret problem

उत्तर

0

आप सही दशमलव से पहले कैरेट को हिलाने चाहते हैं, इस कोशिश:

this.CaretIndex = string.Substring(0, this.Text.IndexOf(".")).Length; 
  • यदि उपरोक्त चाल दशमलव के बाद कैरट, इसे बदलने के यहाँ एक छोटा उदाहरण है यह करने के लिए:

    this.CaretIndex = string.Substring(0, this.Text.IndexOf(".") - 1).Length;

आप बॉक्स की शुरुआत करने के लिए कैरेट को हिलाने करना चाहते हैं:

this.CaretIndex = 0; 

आप बॉक्स के अंत तक कैरेट को हिलाने करना चाहते हैं:

this.CaretIndex = this.Text.Length; 
संबंधित मुद्दे