2013-09-03 19 views
6

Mam bardzo dziwny problem:WPF DatePicker Watermark używa nieodpowiedniego języka, ale Dateformat jest poprawna

Na moim komputerze datepicker zmienia swój znak wodny i data-format, w zależności od języka/kultury Chcę ustawić.

Jeśli mogę skopiować aplikację do innych komputerów następujących sytuacji:

Na jakiś komputer działa jak to robi na moim komputerze. Na innych komputerach zmienia się tylko format daty, ale znak wodny nie! Nie trzeba dodawać, że jest bardzo brzydki mieć datepicker z np. niemiecka data, ale angielski znak wodny.

Jaka jest przyczyna tego zachowania?

Dla i18n używam następujący kod:

App.xaml.cs:

public partial class App : Application 
{ 
    public App() 
    { 
     CultureInfo ci = new CultureInfo("de-DE"); 
     Thread.CurrentThread.CurrentCulture = ci; 
     Thread.CurrentThread.CurrentUICulture = ci; 
    } 
} 

WindowMain.xaml.cs:

public partial class WindowMain : RibbonWindow 
{ 
    public WindowMain() 
    { 
     this.Language = XmlLanguage.GetLanguage("de-DE"); 
     this.InitializeComponent(); 
    } 
} 

Odpowiedz

5

Jedno mogę powiedzieć, Watermark w DatePicker zaimplementowany buggy, nie ma łatwego dostępu. Być może, z powodu tej trudności, lokalizacja tekstu nie działa. Jest to wspaniały artykuł @Matt Hamilton, cytat z here:

Coś, że wiele osób (w tym ja) nie lubią o DatePicker jest jednak to, że domyślnie jeśli nie jest wyświetlana data to pokazuje tekst "Wybierz datę" jako znak wodny, a tekst ten jest zapakowany w formant - nie jest zlokalizowany ani dostępny dla żadnej publicznej własności. Jest to szczególnie frustrujące, jeśli dana data jest opcjonalna i niekoniecznie chcesz zachęcić użytkowników do jej wybrania.

W tym samym artykule podaje decyzję o dostępie do Watermark. Tutaj:

How to localize the WPF 4.0 DatePicker control

@Wayne Maurer stworzył uniwersalne rozwiązanie w postaci załączonym zależność nieruchomości:

<DatePicker Grid.Row="2" 
      local:DatePickerWatermarkBehaviour.Watermark="Select the date" /> 

Musisz być oparta na aktualnej kulturze, ustawić tekst dla znaków wodnych, na przykład używając powyższego przykładu.

Note: W Silverlight do Watermark w DatePicker wykonane dostęp [link]:

DatePickerTextBox box = base.GetTemplateChild("TextBox") as DatePickerTextBox; 
box.Watermark = "Type or select a date --> "; 
+0

Dzięki za odpowiedź! Jest to dość pouczające, ale nie wyjaśnia, dlaczego lokalizacja działa na niektórych maszynach. To mnie myli. –

+0

@M C: Tak, zgadzam się, że to dziwne. Na maszynach z systemem operacyjnym? Są to te same systemy operacyjne lub inne? –

+0

2 maszyny mają maszyny WinXP 2 Win7. Wygrywa 1 Win XP i 1 Win7. inni nie. więc nie jest to system operacyjny. Ale obie maszyny robocze miały na nich Visual Studio. Mój dostał VS2012 pro, drugi ekspres VS2010. Czy to możliwe, że zapomniałem skopiować niektóre zespoły na komputery użytkowników, ponieważ działa ono na komputerach deweloperów? Jeśli tak: które? –

3

To rzeczywiście bardzo łatwy do ustawienia znaku wodnego tekst:

<DatePicker> 
    <DatePicker.Resources> 
    <Style TargetType="DatePickerTextBox"> 
     <Setter Property="Text" Value="Watermark Text"/> 
    </Style> 
    </DatePicker.Resources> 
</DatePicker> 

http://www.admindiaries.com/change-datepicker-watermark-in-wpf/

+1

Awesome! Masz pomysł, jak zmienić kolor tekstu? Pierwszy plan nie działa. – Den

+2

To nie zmienia znaku wody, to faktycznie ustawia tekst. Powoduje to inne zachowanie przy wprowadzaniu daty do sterowania za pomocą klawiatury. – scher

1

rozwiązanie Wayne działa świetnie ale nie działa, gdy DatePicker jest częścią DataGridColumnHeader i innych razy, gdy DatePicker jest pod kontrolą, który jest najpierw ukryty, a następnie widoczny.Rozwiązanie Matta Hamiltona działa tylko w trybie onload, a po zmianie selectedDate ponownie denerwuje Wybierz datownik wodny. Najprostszym rozwiązaniem jest zastąpienie zdarzenia OnRender w klasie niestandardowej. Jeśli ustawisz właściwość znaku wodnego, a nie treść znaku wodnego, która będzie potrzebna do zastąpienia zdarzenia onload. Pełna klasa jest tutaj:

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

}