Chciałbym użyć formatu ciągu o nazwie Short Date w WPF.
Próbowałem czegoś takiego:
<TextBlock Text="{Binding Date, StringFormat='Short Date'}" />
Jak to zrobić?
Odpowiedzi:
Spróbuj tego:
<TextBlock Text="{Binding PropertyPath, StringFormat=d}" />
który jest wrażliwy na kulturę i wymaga .NET 3.5 SP1 lub nowszego.
UWAGA: Rozróżniana jest wielkość liter. „d” to specyfikator formatu daty krótkiej, a „D” to specyfikator formatu daty długiej .
Pełna lista formatów ciągów znajduje się na stronie MSDN w standardowych ciągach formatu daty i godziny oraz pełniejsze wyjaśnienie wszystkich opcji w tym wpisie na blogu MSDN
Jest jednak jeden problem - zawsze wyświetla datę w formacie amerykańskim, chyba że sam ustawisz kulturę na poprawną wartość.
Jeśli ta właściwość nie zostanie ustawiona, aparat powiązań użyje właściwości Language obiektu docelowego powiązania. W języku XAML jest to domyślnie „en-US” lub dziedziczy wartość z elementu głównego (lub dowolnego elementu) strony, jeśli został jawnie ustawiony.
Można to zrobić w kodzie (zakładając, że ustawiłeś kulturę wątku na poprawną wartość):
this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);
Innym sposobem jest ustawienie kultury konwertera w powiązaniu:
<TextBlock Text="{Binding PropertyPath, StringFormat=d, ConverterCulture=en-GB}" />
Chociaż nie pozwala to na zlokalizowanie wyjścia.
Lub użyj tego dla formatu angielskiego (lub wymieszaj go dla niestandardowego):
StringFormat='{}{0:dd/MM/yyyy}'
Użyj StringFormat
właściwości (lub ContentStringFormat
na ContentControl
i jej pochodnych, np Label
.).
<TextBlock Text="{Binding Date, StringFormat={}{0:d}}" />
Zwróć uwagę, że notacja {}
poprzedzająca standardową String.Format
notację argumentów pozycyjnych pozwala na ucieczkę nawiasów klamrowych w języku rozszerzenia znaczników.
{}
Będzie można używać StringFormat='{}Created Date:{0:d}'
które w przeciwnym razie byłyby nieoczekiwane rezultaty.
Niektóre przykłady DateTime StringFormat, które uznałem za przydatne. Zaczerpnięte z przykładów C #
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24
String.Format("{0:m mm}", dt); // "5 05" minute
String.Format("{0:s ss}", dt); // "7 07" second
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes
String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M.
String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" time zone
Zwróć uwagę na pojedyncze cudzysłowy dla formatu ciągu. To nie działa:
Content="{Binding PlannedDateTime, StringFormat={}{0:yy.MM.dd HH:mm}}"
podczas gdy to robi:
Content="{Binding PlannedDateTime, StringFormat='{}{0:yy.MM.dd HH:mm}'}"