J'essaie de formater un bloc de texte lié à une TimeSpan
propriété. Cela fonctionne si la propriété est de type DateTime
mais échoue s'il s'agit d'un fichier TimeSpan
. Je peux le faire en utilisant un convertisseur. Mais j'essaie de savoir s'il existe des alternatives.
Exemple de code:
public TimeSpan MyTime { get; set; }
public Window2()
{
InitializeComponent();
MyTime = DateTime.Now.TimeOfDay;
DataContext = this;
}
Xaml
<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>
Je m'attends à ce que le bloc de texte affiche seulement les heures et les minutes. Mais il apparaît comme:
19: 10: 46.8048860
Réponses:
Dans .NET 3.5, vous pouvez utiliser un MultiBinding à la place
Mettre à jour
Pour répondre aux commentaires.
Pour vous assurer de générer 2 chiffres même si les heures ou les minutes sont compris entre 0 et 9, vous pouvez utiliser {0:00} au lieu de {0}. Cela garantira que la sortie pour l'heure 12:01 est 12:01 au lieu de 12: 1.
Si vous voulez afficher 01:01 comme 1:01, utilisez
StringFormat="{}{0}:{1:00}"
Et la mise en forme conditionnelle peut être utilisée pour supprimer le signe négatif pendant quelques minutes. Au lieu de {1:00}, nous pouvons utiliser {1: 00; 00}
la source
.Hours
ainsi qu'à.Minutes
TotalMinutes
au lieu d'uneMinutes
partie des minutes (pour afficher les intervalles de temps les plus longs de 1 heure). Mais laTotalMinutes
propriété est au format double, donc la liaison à l'aide de la<Binding Path="MyTime.TotalMinutes" />
sortie arrondie, ce qui est mauvais - je dois afficher une valeur tronquée au lieu d'arrondir. Il est possible d'y parvenir sans utiliser un convertisseur de valeur personnalisé pour tronquer double en int?La chaîne de format est destinée à fonctionner sur un
DateTime
, pas sur unTimeSpan
.Vous pouvez modifier votre code pour travailler avec
DateTime.Now
place. Votre xaml va bien:Mettre à jour
Et à partir du format .Net 4 a
TimeSpan
comme suit:la source
Juste pour ajouter au pool, j'utilise avec succès cette liaison pour afficher un TimeSpan dans une application WPF de production:
J'ai essayé de corriger les contre-obliques :)
la source
StringFormat
doit être sous la forme d'une chaîne de format. Dans ce cas, cela ressemblerait à:Remarque: si vous souhaitez afficher le nombre total d'heures et de minutes et que la durée est supérieure à 24 heures, il y a une mise en garde avec votre approche: voici une solution de contournement .
la source
Pour les liaisons multiples, vous devez faire attention depuis .NET 4.
Un bref aperçu ci-dessous, testé avec .NET 4.6:
Reliure régulière:
Reliure multiple:
ou vous pouvez utiliser " au lieu de " dans le multibinding:
Remarque: en utilisant StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" sera pas travailler sur un MultiBinding, cela se traduira par un résultat blanc.
la source
Je suis conscient que cette question est ancienne maintenant, mais je suis surpris que personne n'ait suggéré ce simple
StringFormat
qui fonctionneraTimeSpan
directement sur un :la source
WPF dans .NET 4 a désormais une durée à partir de chaînes http://msdn.microsoft.com/en-us/library/ee372286.aspx
J'utilise ce qui suit
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
la source
Si vous souhaitez utiliser StringFormat dans une étiquette qui utilise la propriété Content, vous pouvez utiliser ContentStringFormat pour mettre en forme votre période:
la source
Content
propriété (c'est-à-dire pas laText
propriété comme, par exemple, aTextBlock
), la propriétéContentStringFormat
doit être utilisée. La spécificationStringFormat
dans le cadre de la liaison ne fonctionnera pas.TimeSpan StringFormat avec des millisecondes:
la source