2009-07-09 6 views
10

J'utilise la dernière boîte à outils WPF, plus précisément le DatePicker. Tout fonctionne correctement, mais lorsqu'aucune valeur n'est fournie, le texte "SHOW CALENDAR" par défaut apparaît dans DatePickerTextBox. Je veux être en mesure de changer cette valeur dans WPF. Un m'a dit de télécharger la source, ajouter une nouvelle propriété de dépendance et recompiler en DLL. C'est cool mais que se passe-t-il si une nouvelle version est publiée?WPF toolkit DatePicker changer la valeur par défaut «Afficher le calendrier»

C'est pourquoi je voudrais modéliser ce contrôle de cette façon, que je serai en mesure de remplacer cette chaîne par défaut. Une idée de comment faire ça?

Merci!

+2

J'ai trouvé une meilleure solution [ici sur Matt Hamilton Blog] (http://matthamilton.net/datepicker-watermark). Les travaux me forment excellent! – BrightShadow

Répondre

22

OK. J'ai trouvé une solution par moi-même.

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

Quoi qu'il en soit, vous devez être conscient du fait, qu'il ya un DependencyProperty appelé filigrane qui devrait être mis à la place du texte. Le problème est qu'avec la dernière version de MS (vers juin 2009), ils ont fait de cette propriété en lecture seule pour une raison inconnue. Cela signifie que c'est le seul hack que j'ai créé, bien qu'il y ait une exception de première fois, car le DatePicker essaie d'analyser la chaîne (il suppose que le texte est une date), mais normalement vous ne le remarquerez pas.

Une autre possibilité est de modifier directement le code source à partir de MS et override la méthode SetWaterMark() + ajoutez votre propre propriété de dépendance (MyWaterMark ou quelque chose). Mais alors vous ne pouvez pas utiliser le dll fourni. Ils ont dit qu'il viendra fixé avec le .NET 4 realese, voyons.

+0

C'est bon et tout, mais comment pouvons-nous l'intégrer dans un style existant qui cible Datepicker ??? –

+0

Cela ne semble fonctionner temps de conception dans mon application, dès que je lance, le texte revient à l'anglais –

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); 
       } 
      } 
     } 
    } 

Vous devrez également connecter l'événement Load avec le même code.

+0

Eh bien, je dois admettre, je vous aime exemple avec Reflection .. de toute façon .. vous avez besoin d'un code derrière –

+0

Couldn Ne mettons-nous pas cela dans une propriété de dépendance? –

0

Cela fonctionne très bien mais vous devrez également surcharger la méthode onrender dans la classe personnalisée. Dans cette méthode, si vous définissez un contenu de filigrane et non la propriété, il n'est pas nécessaire de remplacer l'événement OnSelectedDateChanged. Code complet est ici:

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

Vous pouvez aussi le faire:

Ajouter une zone de texte et un datepicker à votre formulaire avec les paramètres suivants:

Dans votre window.xaml:

<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"/> 

Et dans votre window.xaml.cs:

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

Le résultat ressemble à ceci: klick

Questions connexes