WPF : la gestion des dates (Label, TextBlock)
Le Label et le TextBlock affichent les dates de manières différentes.
Le label utilise la Culture, et pas le Textblock (du moins pas la culture courante)
Exemple :
<TextBlock Text="binding with TextBlock"></TextBlock>
<TextBlock Margin="10,0,0,0">
<TextBlock.Text>
<Binding Source="{x:Static s:DateTime.Now}">
</Binding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text="Binding with Label"></TextBlock>
<Label Margin="10,0,0,0" Padding="0">
<Label.Content>
<Binding Source="{x:Static s:DateTime.Now}">
</Binding>
</Label.Content>
</Label>
donne :
et pourtant ma cullture est :
mais comment fait donc le "TextBlock" pour m' afficher la date dans ce format ?
et bien tout simplement du binding....
en effet la propriété "Text" du TextBlock étant de type "string", le Binding effectue une conversion, alors que pour le Label, la propriété Content étant de type object, le binding n' effectue aucune conversion.
il reste une question, quelle est la culture utilisée pour la conversion ?
1) si la propriété "ConverterCulture" du Binding est affectée c' est cette culture qui est utilisée.
<Binding Source="{x:Static s:DateTime.Now}"
ConverterCulture="{x:Static sg:CultureInfo.CurrentUICulture}">
</Binding>
2) Sinon c' est la propriété "Language" du l' élément (FrameworkElement.Language) qui est utilisée.
<TextBlock Margin="10,0,0,0" x:Name="tb1" Language="fr-FR">
<TextBlock.Text>
<Binding Source="{x:Static s:DateTime.Now}" x:Name="tbbinding">
</Binding>
</TextBlock.Text>
</TextBlock>
très bien mais alors que vaut la propriété "Language", lorsque celle-ci n' est pas spécifiée ?
et oui "en-us", mon ami Reflector me le confirme...
Oui mais !
il y a encore un truc qui me chiffonne..., le Label n' affiche pas les secondes !!!
Après un essai "DateTime.Now.ToString()" affiche bien les secondes et utilise la culture.
De plus le Label possède un ContentPresenter pour afficher son contenu, qui lui même à comme template par défaut un "TextBlock"
... dans les deux cas j' ai un TextBlock... mais alors pourqoi l' affichage est différent ?
hum hum, le binding ???
Oui encore lui !
le binding utilisé entre le ContentPresenter et son TextBlock interne est un "TemplateBindingExtension", qui lui par défaut cherche un TypeConverter en faisant quelque chose du style :
TypeConverter tc = TypeDescriptor.GetConverter(typeof(DateTime));
if (tc.CanConvertTo(typeof(string)))
{
return (string)tc.ConvertTo(DateTime.Now, typeof(string));
}
(graçe au symboles, j'ai pu parcourir le contenu des sources du ContentPresenter....)
et par défaut le DateTimeConverter effectue un .ToString(format.ShortDatePattern + " " format.ShortTimePattern)
à suivre...
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :