WPF Bağlama StringFormat Kısa Tarih Dizesi


89

WPF'de Kısa Tarih adlı dize biçimi kullanmak istiyorum.

Şöyle bir şey denedim:

<TextBlock Text="{Binding Date, StringFormat='Short Date'}" />

Bu nasıl yapılır?

Yanıtlar:


179

Bunu dene:

<TextBlock Text="{Binding PropertyPath, StringFormat=d}" />

Kültüre duyarlıdır ve .NET 3.5 SP1 veya üstünü gerektirir.

NOT: Bu, büyük / küçük harfe duyarlıdır. "d" kısa tarih biçimi belirticisi , "D" ise uzun tarih biçimi belirticisi .

Standart Tarih ve Saat Biçimi Dizelerindeki MSDN sayfasında tam bir dize biçimi listesi ve bu MSDN blog gönderisindeki tüm seçeneklerin daha kapsamlı bir açıklaması bulunmaktadır.

Bununla birlikte, bununla ilgili bir sorun var - kültürü kendiniz doğru değere ayarlamadığınız sürece tarihi her zaman ABD formatında çıkarır.

Bu özelliği ayarlamazsanız, bağlama motoru bağlama hedef nesnesinin Language özelliğini kullanır . XAML'de bu, varsayılan olarak "en-US" olur veya açıkça ayarlanmışsa, sayfanın kök öğesinden (veya herhangi bir öğesinden) değeri devralır.

Kaynak

Bunu yapmanın bir yolu arkasındaki koddadır (iş parçacığının kültürünü doğru değere ayarladığınızı varsayarak):

this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);

Diğer bir yol, dönüştürücü kültürünü bağlamada ayarlamaktır:

<TextBlock Text="{Binding PropertyPath, StringFormat=d, ConverterCulture=en-GB}" />

Bu çıktıyı yerelleştirmenize izin vermez.


Teşekkür ederim! Anladın! Kısa Tarih dizesi biçiminin ne olduğunu sorduğumda, dize biçimleri listesini nerede bulabilirim ve ayrıca StringFormat = d ile yanıtlamanı sevdim. Çok açık ve eksiksiz.
Tony

bu, kültür ayarlarından bağımsız olarak her zaman ABD formatı mı verir?
CRice

@CRice - evet öyle - bazı nedenlerden dolayı - kültürü kendiniz belirlediniz.
ChrisF

1
Teşekkürler, UI "d" aynı tarih nesnesinin xaml.cs "d" değerinden farklı çıktılar verdiğinde oldukça kötü.
CRice

WPF kültür hatasını ref, sadece this.Language = System.Windows.Markup.XmlLanguage.GetLanguage (System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag) ekledim; her pencerede bileşeni başlattıktan sonra;
peterG

54

Veya bunu bir İngilizce format için kullanın (veya özel olarak karıştırın):

StringFormat='{}{0:dd/MM/yyyy}'

2
Bağlamınızda 'ConverterCulture =' da kullanabilirsiniz - bu, biçimi belirtmek için bir değer gerektirir. (ConverterCulture = 'en-GB' Büyük Britanya'dır).
aksi takdirde

bu sorunun en iyi ve en kolay cevabı
Steven

Şerefe Steven! Ayrıca ConverterCulture eklentisinin "kazanan" cevabını da geçtim ... ama öyle olsun.
aksi takdirde

28

StringFormatMülkü kullanın (veya ContentStringFormatüzerinde ContentControlve türevlerini, örneğin Label).

<TextBlock Text="{Binding Date, StringFormat={}{0:d}}" />

Not {}standart öncesinde String.Formatpozisyonel argüman gösterimde parantez biçimlendirme uzantısı dilinde çıkış yapılmasını sağlar.


4
{}Kullanmak sağlayacak StringFormat='{}Created Date:{0:d}'aksi beklenmeyen sonuçlar üretecektir hangi.
Kahverengimsi Canavar

13

Yararlı bulduğum bazı DateTime StringFormat örnekleri. C # Örneklerinden Kaldırıldı

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

5

Değer içeren bir dize eklemek istiyorsanız, şunu kullanın:

<TextBlock Text="{Binding Date, StringFormat= 'Date : {0:d}'}" />

5

Dize biçimi için tek tırnakların farkında olun. Bu çalışmıyor:

    Content="{Binding PlannedDateTime, StringFormat={}{0:yy.MM.dd HH:mm}}"

bu ise:

    Content="{Binding PlannedDateTime, StringFormat='{}{0:yy.MM.dd HH:mm}'}"

4

Sadece kullan:

<TextBlock Text="{Binding Date, StringFormat=\{0:d\}}" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.