2009-07-09 12 views
10

मैं नवीनतम WPF टूलकिट, विशेष रूप से DatePicker का उपयोग कर रहा हूं। सबकुछ ठीक काम करता है, लेकिन जब कोई मूल्य प्रदान नहीं किया जाता है, तो डिफ़ॉल्ट 'शो कैलेंडर' टेक्स्ट डेटपिकर टेक्स्टबॉक्स में दिखाई देता है। मैं इस मान को WPF में बदलने में सक्षम होना चाहता हूं।WPF टूलकिट डेटपिकर डिफ़ॉल्ट मान 'शो कैलेंडर'

एक ने मुझे स्रोत डाउनलोड करने, एक नई निर्भरता संपत्ति जोड़ने और डीएल के लिए पुन: संकलित करने के लिए कहा। यह अच्छा है लेकिन क्या नया संस्करण जारी किया गया है?

यही कारण है कि मैं इस तरह से इस नियंत्रण को टेम्पलेट करना चाहता हूं, कि मैं इस डिफ़ॉल्ट स्ट्रिंग को ओवरराइड करने में सक्षम हूं। कोई विचार यह कैसे करना है?

धन्यवाद!

+2

मुझे मैट हैमिल्टन ब्लॉग पर बेहतर समाधान मिला [http://matthamilton.net/datepicker-watermark)। काम मुझे उत्कृष्ट बनाते हैं! – BrightShadow

उत्तर

22

ठीक है। मुझे अपने आप से एक समाधान मिला।

<Style TargetType="{x:Type toolkit:DatePickerTextBox}"> 
    <Setter Property="Text" Value="Bitte wählen" /> 
</Style> 

फिर भी, आप एक DependencyProperty वॉटरमार्क जो पाठ के स्थान पर स्थापित किया जाना चाहिए कहा जाता है कि वहाँ तथ्य के बारे में पता होना चाहिए।

समस्या यह है कि नवीनतम एमएस रिलीज (लगभग जून 200 9) के साथ उन्होंने इस संपत्ति को कुछ अज्ञात कारणों से पढ़ा। इसका मतलब है, यह एकमात्र हैक मैंने बनाया है, हालांकि पहली बार अपवाद होता है, क्योंकि डेटपिकर स्ट्रिंग को पार्स करने का प्रयास कर रहा है (वह टेक्स्ट को डेट होने का अनुमान लगाता है), लेकिन आम तौर पर आप इसे नोटिस नहीं करेंगे।

एक और संभावना सीधे एमएस से स्रोत कोड और ओवरराइडSetWaterMark() विधि संपादित + अपने स्वयं निर्भरता संपत्ति (MyWaterMark या कुछ और) जोड़ने के लिए है। लेकिन फिर आप प्रदत्त dll का उपयोग नहीं कर सकते हैं। उन्होंने कहा कि यह को .NET 4 realese के साथ तय कर देगा, चलो देखते हैं।

+0

यह अच्छा और सब कुछ है, लेकिन हम इसे मौजूदा शैली में कैसे शामिल कर सकते हैं जो डेटपिकर को लक्षित करता है ??? –

+0

जैसे ही मैं लॉन्च करता हूं, यह मेरे एप्लिकेशन में केवल डिज़ाइन डिज़ाइन का समय लगता है, पाठ अंग्रेजी में –

6
void _datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (_datePicker1.SelectedDate != null) return; 

     FieldInfo fiTextBox = typeof(DatePicker) 
      .GetField("_textBox", BindingFlags.Instance | BindingFlags.NonPublic); 

     if (fiTextBox != null) 
     { 
      DatePickerTextBox dateTextBox = 
       (DatePickerTextBox)fiTextBox.GetValue(_datePicker1); 

      if (dateTextBox != null) 
      { 
       PropertyInfo piWatermark = dateTextBox.GetType() 
        .GetProperty("Watermark", BindingFlags.Instance | BindingFlags.NonPublic); 

       if (piWatermark != null) 
       { 
        piWatermark.SetValue(dateTextBox, "", null); 
       } 
      } 
     } 
    } 

आपको लोड ईवेंट को उसी कोड के साथ-साथ हुक करने की आवश्यकता होगी।

+0

पर वापस आ जाता है, ठीक है मुझे स्वीकार करना है, मुझे आपको प्रतिबिंब के साथ उदाहरण पसंद है .. वैसे भी .. आपको –

+0

के पीछे एक कोड चाहिए हम इसे एक निर्भरता संपत्ति में डाल नहीं ??? –

0

यह बहुत अच्छा काम करता है लेकिन आपको कस्टम क्लास में ऑनरडर विधि ओवरराइड करना होगा। इस विधि में यदि आप वॉटरमार्क सामग्री सेट करते हैं और संपत्ति नहीं है तो OnSelectedDateChanged ईवेंट को ओवरराइड करने की आवश्यकता नहीं है। पूरा कोड यहाँ है:

public string Watermark { get; set; } 

    protected override void OnSelectedDateChanged(SelectionChangedEventArgs e) 
    { 
     base.OnSelectedDateChanged(e); 
     //SetWatermark(); 
    } 

    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) 
    { 
     base.OnRender(drawingContext); 
     SetWatermark(); 
    } 

    private void SetWatermark() 
    { 
     FieldInfo fiTextBox = typeof(DatePicker).GetField("_textBox", BindingFlags.Instance | BindingFlags.NonPublic); 
     if (fiTextBox != null) 
     { 
      DatePickerTextBox dateTextBox = (DatePickerTextBox)fiTextBox.GetValue(this); 
      if (dateTextBox != null) 
      { 
       if (string.IsNullOrWhiteSpace(this.Watermark)) 
       { 
        this.Watermark = "Custom select a date"; 
       } 

       //PropertyInfo piWatermark = typeof(DatePickerTextBox).GetProperty("Watermark", BindingFlags.Instance | BindingFlags.NonPublic); 
       //if (piWatermark != null) 
       //{ 
       // piWatermark.SetValue(dateTextBox, this.Watermark, null); 
       //} 

       var partWatermark = dateTextBox.Template.FindName("PART_Watermark", dateTextBox) as ContentControl; 
       if (partWatermark != null) 
       { 
        partWatermark.Foreground = new SolidColorBrush(Colors.Gray); 
        partWatermark.Content = this.Watermark; 
       } 
      } 
     } 
    } 
0

तुम भी ऐसा कर सकता है:

अपने window.xaml में:

एक पाठ बॉक्स और निम्नलिखित सेटिंग्स के साथ अपने फार्म के लिए एक datepicker जोड़े

<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="22" Margin="38,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
    <DatePicker x:Name="datePicker" HorizontalAlignment="Left" Margin="130,37,0,0" VerticalAlignment="Top" Width="28" BorderBrush="Transparent" SelectedDateChanged="datePicker_SelectedDateChanged"/> 

और अपने window.xaml.cs में:

private void datePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 
     textBox.Text = datePicker.SelectedDate.Value.ToString("dd.MM.yyyy"); 
    } 

परिणाम इस तरह दिखता है: klick

संबंधित मुद्दे