2010-09-08 9 views

उत्तर

4

दुर्भाग्यवश, वॉटरमार्क टेक्स्ट सेट करना थोड़ा मुश्किल है।

यह कैसे किया जा सकता है आप इस लेख में देख सकते हैं: Changing the watermark text in a DatePicker control

+0

यह सिल्वरलाइट में ही काम करता है। – svick

+0

डब्ल्यूपीएफ पक्ष से कोई समाधान? – papaiatis

10

यहाँ कैसे DatePicker से एक नया नियंत्रण प्राप्त करने के लिए बिना यह करना है:

Customizing the WPF DatePicker's Watermark

+0

मुझे यह समाधान पसंद है –

24

मैं मैट के विचार ले लिया है , और इसे कुछ हद तक बढ़ाया; मैंने एक संलग्न व्यवहार लागू किया है जो आपको XAML के माध्यम से प्रत्येक डेटपिकर नियंत्रण के लिए वॉटरमार्क परिभाषित करने की अनुमति देता है।

namespace DatePickerWatermark 
{ 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Controls.Primitives; 
    using System.Windows.Media; 

    public static class DatePickerWatermarkBehaviour 
    { 
     public static readonly DependencyProperty WatermarkProperty = 
      DependencyProperty.RegisterAttached(
       "Watermark", 
       typeof(string), 
       typeof(DatePickerWatermarkBehaviour), 
       new UIPropertyMetadata(null, OnWatermarkChanged)); 

     public static string GetWatermark(Control control) 
     { 
      return (string)control.GetValue(WatermarkProperty); 
     } 

     public static void SetWatermark(Control control, string value) 
     { 
      control.SetValue(WatermarkProperty, value); 
     } 

     private static void OnWatermarkChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
     { 
      var datePicker = dependencyObject as DatePicker; 
      if (datePicker == null) 
       return; 

      if ((e.NewValue != null) && (e.OldValue == null)) 
       datePicker.Loaded += DatePickerLoaded; 
      else if ((e.NewValue == null) && (e.OldValue != null)) 
       datePicker.Loaded -= DatePickerLoaded; 
     } 

     private static void DatePickerLoaded(object sender, RoutedEventArgs e) 
     { 
      var datePicker = sender as DatePicker; 
      if (datePicker == null) 
       return; 

      var datePickerTextBox = GetFirstChildOfType<DatePickerTextBox>(datePicker); 
      if (datePickerTextBox == null) 
       return; 

      var partWatermark = datePickerTextBox.Template.FindName("PART_Watermark", datePickerTextBox) as ContentControl; 
      if (partWatermark == null) 
       return; 

      partWatermark.Content = GetWatermark(datePicker); 
     } 

     private static T GetFirstChildOfType<T>(DependencyObject dependencyObject) where T : DependencyObject 
     { 
      if (dependencyObject == null) 
       return null; 

      for (var i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++) 
      { 
       var child = VisualTreeHelper.GetChild(dependencyObject, i); 
       var result = (child as T) ?? GetFirstChildOfType<T>(child); 
       if (result != null) 
        return result; 
      } 

      return null; 
     } 
    } 
} 

यहां कुछ उदाहरण XAML है:: यहाँ कोड है

<Window x:Class="DatePickerWatermark.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:b="clr-namespace:DatePickerWatermark" Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="DatePicker"> 
       <Setter Property="Margin" Value="10,5"/> 
      </Style> 
      <Style x:Key="EnglishDatePicker" TargetType="DatePicker" BasedOn="{StaticResource {x:Type DatePicker}}"> 
       <Setter Property="b:DatePickerWatermarkBehaviour.Watermark" Value="Please select a date:"/> 
      </Style> 
     </Grid.Resources> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="200"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <DatePicker Grid.Row="0" b:DatePickerWatermarkBehaviour.Watermark=""/> 
     <DatePicker Grid.Row="1" b:DatePickerWatermarkBehaviour.Watermark="Wählen Sie ein Datum"/> 
     <DatePicker Grid.Row="2" b:DatePickerWatermarkBehaviour.Watermark="Sélectionner une date"/> 
     <DatePicker Grid.Row="3" Style="{StaticResource EnglishDatePicker}"/> 
     <DatePicker Grid.Row="4" Style="{StaticResource EnglishDatePicker}"/> 
    </Grid> 
</Window> 
1

वेन, इस महान काम करता है लेकिन काम नहीं करता है जब DatePicker DataGridColumnHeader का हिस्सा है और कभी-कभी पहले छिपा हुआ है कि जब DatePicker नियंत्रण पर है और फिर दृश्यमान। मैट हैमिल्टन का समाधान केवल लोड पर काम करता है, और जब आप चयनित दिनांक बदलते हैं तो फिर से परेशान होता है डेट वॉटरमार्क का चयन करें। कस्टम क्लास में ऑनरेंडर इवेंट ओवरराइड करने का सबसे आसान समाधान है। यदि आप वॉटरमार्क संपत्ति सेट करते हैं और वॉटरमार्क सामग्री नहीं है जिसे आपको ऑनलोड ईवेंट को ओवरराइड करने की आवश्यकता है। पूर्ण वर्ग यहां है:

public class myDateTimePicker : DatePicker 
{ 

    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 watermark"; 
       } 

       // if you set property this way then you need to override OnSelectedDateChanged event 
       //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; 
       } 
      } 
     } 
    } 

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