web-dev-qa-db-fra.com

Comment formater TimeSpan en XAML

J'essaie de formater un bloc de texte lié à une propriété TimeSpan. Cela fonctionne si la propriété est de type DateTime mais échoue s'il s'agit de 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 ne montre que des heures et des minutes. Mais cela se voit comme:

19: 10: 46.8048860

86
biju

Dans .NET 3.5, vous pouvez utiliser une liaison multiple à la place.

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}:{1}">
            <Binding Path="MyTime.Hours"/>
            <Binding Path="MyTime.Minutes"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Mettre à jour
Pour répondre aux commentaires.

Pour être sûr de produire 2 chiffres, même si heures ou minutes sont comprises 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 en 01:01, utilisez StringFormat="{}{0}:{1:00}"

Et Mise en forme conditionnelle peut être utilisé pour supprimer le signe négatif pendant quelques minutes. Au lieu de {1:00}, nous pouvons utiliser {1: 00; 00}

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0:00}:{1:00;00}">
            <Binding Path="MyTime.Hours" />
            <Binding Path="MyTime.Minutes" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
84
Fredrik Hedblad

La chaîne de format est destinée à fonctionner sur un DateTime, pas un TimeSpan.

Vous pouvez changer votre code pour travailler avec DateTime.Now au lieu. Votre xaml va bien:

<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>

Mettre à jour

Et à partir de . Net 4 , formatez un TimeSpan comme suit:

<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>
133
Tim Lloyd

Juste pour ajouter au pool, j'utilise avec succès cette liaison pour afficher un TimeSpan dans une application WPF de production:

Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"

A pris quelques tentatives pour obtenir les barres obliques inverses correctes :)

41
Cygon

StringFormat doit être sous la forme d'une chaîne de format. Dans ce cas, cela ressemblerait à:

<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>

Remarque: si vous souhaitez afficher le nombre total d’heures et de minutes et que la durée est supérieure à 24 heures, vous devez indiquer une approche: voici une solution de contournement .

21
Peter Lillevold

Pour les liaisons multiples, vous devez faire attention depuis .NET 4.

Un bref aperçu ci-dessous, testé avec .NET 4.6:

Liaison régulière:

<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />

Liaison multiple:

<TextBlock.Text>
    <MultiBinding StringFormat="{}{0:hh':'mm':'ss} -> {1:hh':'mm':'ss}">
        <Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
        <Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
    </MultiBinding>
</TextBlock.Text>

ou vous pouvez utiliser " au lieu de ' dans la reliure multiple:

<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>

Remarque: utilisez StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" travaillera pas sur une liaison multiple, cela donnera un résultat vide.

14
juFo

WPF dans .NET 4 a maintenant une période de temps à partir de chaînes http://msdn.Microsoft.com/en-us/library/ee372286.aspx

J'utilise le suivant <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />

12
Ira

Je suis conscient que cette question est ancienne maintenant, mais je suis surpris que personne n'ait suggéré ce simple StringFormat qui fonctionnera directement sur un TimeSpan:

<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>
11
Sheridan

Si vous souhaitez utiliser StringFormat dans une étiquette qui utilise la propriété Content, vous pouvez utiliser ContentStringFormat pour formater votre intervalle de temps:

<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"
7
mcflux101