Comment formater de Temps en XAML
Je suis en train de formater un textblock qui est lié à un TimeSpan
de la propriété. Il fonctionne si la propriété est de type DateTime
mais il ne parvient pas si c'est un TimeSpan
. Je peux le faire à l'aide d'un convertisseur. Mais je suis en train d'essayer de trouver s'il y a 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}"/>
J'attends de la textblock pour afficher seulement les heures et mintes. Mais il montre que:
19:10:46.8048860
- Vous souvenez-vous de quelle version de .Net vous ont été en cours d'exécution sur le chemin du retour en 2010? Je vais avoir un problème similaire avec Windows Phone XAML: stackoverflow.com/q/18679365/1001985
- Remarque: Les {} au début de tous les formats est une séquence d'échappement, pas un spécificateur de format. Il provoque XAML pour tolérer plus de crochets dans le format, sans nécessiter de barres obliques inverses.
Vous devez vous connecter pour publier un commentaire.
Dans .NET 3.5, vous pouvez utiliser une MultiBinding au lieu
Mise à jour
À répondre aux commentaires.
À assurez-vous de la sortie 2 chiffres même si le nombre d'heures ou de minutes, de 0 à 9, vous pouvez utiliser {0:00} au lieu de {0}. Cela permettra de s'assurer de la sortie pour le temps 12:01 12:01 au lieu de 12:1.
Si vous voulez de sortie 01:01 1:01 utilisation
StringFormat="{}{0}:{1:00}"
Et La mise en forme conditionnelle peut être utilisé pour enlever le signe négatif pour les minutes. Au lieu de {1:00} on peut utiliser {1:00;00}
.Hours
ainsi que pour.Minutes
TotalMinutes
au lieu deMinutes
comme minutes de la partie (pour montrer timespans plus longue que 1 heure). MaisTotalMinutes
propriété est en double format, afin de liaison à l'aide de la<Binding Path="MyTime.TotalMinutes" />
produit arrondi de sortie, ce qui est mauvais - j'ai besoin de montrer tronquée de la valeur au lieu d'arrondis. Il est possible de l'atteindre sans l'aide d'une valeur personnalisée coneverter pour tronquer double en int?La chaîne de format est prévu pour fonctionner sur un
DateTime
, pas unTimeSpan
.Vous pouvez modifier votre code pour travailler avec
DateTime.Now
à la place. Votre xaml est fine:Mise à jour
Et de .Net 4 format un
TimeSpan
comme suit:TimeSpan
mise en forme est disponible à partir de .Net 4 seulement.StringFormat
pour avoir toujours deux chiffres même si les minutes de 0 à 9 par exemple.Juste pour ajouter à la piscine, je suis avec succès à l'aide de cette liaison pour afficher une plage de Temps dans une production d'application WPF:
A eu quelques tentatives pour obtenir les barres obliques inverses à droite 🙂
StringFormat
doit être sous la forme d'une chaîne de format. Dans ce cas, il devrait ressembler à:Remarque: si vous souhaitez afficher le nombre total d'heures et de minutes et la plage de temps se trouve être supérieure à 24 heures, il y a un avertissement avec votre approche: Voici une solution de contournement.
Pour le Multi liaisons que vous avez besoin de prêter attention depuis .NET 4.
Un bref aperçu ci-dessous, testé avec .NET 4.6:
Régulière de liaison:
Multi reliure:
ou vous pouvez utiliser " au lieu de ' dans le multibinding:
Note:
à l'aide de StringFormat="{}{0:hh\:\:mm\:ss} -> {1:hh\:mm\:ss}" sera pas travailler sur un MultiBinding, cela aboutira à un résultat vide.
WPF dans .NET 4 a maintenant temps de chaînes http://msdn.microsoft.com/en-us/library/ee372286.aspx
Je suis en utilisant le suivant
<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />
Je suis conscient que cette question est vieux maintenant, mais je suis surpris que personne n'a suggéré que cette simple
StringFormat
qui va travailler sur unTimeSpan
directement:Si vous souhaitez utiliser StringFormat dans un Label qui utilise le Contenu de la propriété, vous pouvez utiliser ContentStringFormat au format de votre laps de temps: