2009-07-09 14 views
10

Korzystam z najnowszego zestawu narzędzi WPF , w szczególności z DatePicker. Wszystko działa poprawnie, ale gdy nie podano wartości, domyślny tekst "POKAŻ KALENDARZ" pojawia się w polu DatePickerTextBox. Chcę móc zmienić tę wartość w WPF.Zestaw narzędzi WPF DatePicker zmień wartość domyślną "pokaż kalendarz"

Jeden powiedział mi, aby pobrać źródło, dodać nową właściwość Dependency i przekompilować do biblioteki dll. To fajne, ale co, jeśli wydamy nową wersję?

Dlatego chciałbym złożyć tę kontrolę w ten sposób, że będę w stanie zastąpić ten domyślny ciąg. Masz pomysł, jak to zrobić?

Dzięki!

+2

Znalazłem lepsze rozwiązanie [tutaj na blogu Matt Hamilton] (http://matthamilton.net/datepicker-watermark). Dzieła tworzą mi doskonałą! – BrightShadow

Odpowiedz

22

OK. Znalazłem rozwiązanie samodzielnie.

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

Anyways, trzeba zdawać sobie sprawę z faktu,, że istnieje DependencyProperty zwany znak wodny, który powinien być ustawiony w miejscu tekstu.

Problem polega na tym, że w najnowszym wydaniu MS (około czerwca 2009 r.) Utworzyli tę własność tylko z jednego tylko nieznanego powodu. Oznacza to, że jest to jedyny hack, który wymyśliłem, chociaż występuje wyjątek First-time, ponieważ DatePicker próbuje przeanalizować ciąg (zakłada, że ​​tekst jest datą), ale normalnie go nie zauważysz.

Inną możliwością jest bezpośrednio edytować kod źródłowy z MS i nadpisanie przy czym sposób SetWaterMark() + dodaj swoją Dependency obiekt (MyWaterMark lub coś). Ale wtedy nie możesz użyć dostarczonego dll. Powiedzieli, że zostanie naprawiony z .NET 4 realese, zobaczmy.

+0

To dobrze i wszystko, ale jak możemy włączyć to do istniejącego stylu docelowego Datepicker ??? –

+0

Wydaje się, że działa tylko czas projektowania w mojej aplikacji, jak tylko uruchomię, tekst powraca do angielskiego –

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

Będziesz także musiał podłączyć zdarzenia Load z tym samym kodem.

+0

Muszę przyznać, że podoba mi się przykład z odbiciem ... tak czy inaczej .. potrzebujesz kodu za –

+0

Couldn "umieściliśmy to w własności zależnej ??? –

0

działa to świetnie, ale musisz także zastąpić metodę onrender w klasie niestandardowej. W tej metodzie, jeśli ustawiono treść znaku wodnego, a nie właściwość, nie ma potrzeby zastępowania zdarzenia OnSelectedDateChanged. Kompletny kod jest tutaj:

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

Można też to zrobić:

Dodaj pole tekstowe i datepicker do formularza z następującymi ustawieniami:

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

iw swoim window.xaml.cs:

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

Wynik wygląda następująco: klick

Powiązane problemy