webentwicklung-frage-antwort-db.com.de

So formatieren Sie TimeSpan in XAML

Ich versuche, einen Textblock zu formatieren, der an eine TimeSpan -Eigenschaft gebunden ist. Es funktioniert, wenn die Eigenschaft vom Typ DateTime ist, aber es schlägt fehl, wenn es sich um eine TimeSpan handelt. Ich kann es mit einem Konverter erledigen. Aber ich versuche herauszufinden, ob es Alternativen gibt.

Beispielcode:

public TimeSpan MyTime { get; set; }

public Window2()
{
    InitializeComponent();
    MyTime = DateTime.Now.TimeOfDay;
    DataContext = this;
}

Xaml

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

Ich erwarte, dass der Textblock nur Stunden und Minuten anzeigt. Aber es zeigt sich als:

19: 10: 46.8048860

86
biju

In .NET 3.5 können Sie stattdessen ein MultiBinding verwenden

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

Update
Um die Kommentare zu beantworten.

Um sicherzustellen, dass Sie 2 Ziffern ausgeben, auch wenn Stunden oder Minuten 0-9 sind, können Sie {0:00} anstelle von {0} verwenden. Dies stellt sicher, dass die Ausgabe für die Zeit 12:01 12:01 statt 12: 1 ist.
Wenn Sie 01:01 als 1:01 ausgeben möchten, verwenden Sie StringFormat="{}{0}:{1:00}"

Und Bedingte Formatierung kann verwendet werden, um das negative Vorzeichen für Minuten zu entfernen. Anstelle von {1:00} können wir auch {1: 00; 00} verwenden.

<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

Die Formatzeichenfolge soll auf einem DateTime und nicht auf einem TimeSpan funktionieren.

Sie können Ihren Code ändern, um stattdessen mit DateTime.Now Zu arbeiten. Dein XAML ist in Ordnung:

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

Update

Und von . Net 4 formatiere ein TimeSpan wie folgt:

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

Nur um den Pool zu erweitern, verwende ich diese Bindung erfolgreich, um eine TimeSpan in einer WPF-Produktionsanwendung anzuzeigen:

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

Habe ein paar Versuche unternommen, um die Backslashes richtig hinzubekommen :)

41
Cygon

StringFormat muss in Form einer Formatzeichenfolge vorliegen. In diesem Fall würde es so aussehen:

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

Hinweis: Wenn Sie die Gesamtzahl der Stunden und Minuten anzeigen möchten und die Zeitspanne länger als 24 Stunden ist, gibt es eine Einschränkung bei Ihrer Vorgehensweise: Hier ist eine Problemumgehung .

21
Peter Lillevold

Bei Multi-Bindungen müssen Sie seit .NET 4 aufpassen.

Eine kurze Übersicht unten, getestet mit .NET 4.6:

Regelmäßige Bindung:

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

Mehrfachbindung:

<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>

oder Sie könnten " anstelle von ' in der Mehrfachbindung verwenden:

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

Hinweis: Verwenden Sie StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" wird nicht an einem MultiBinding arbeiten, dies wird zu einem leeren Ergebnis führen.

14
juFo

WPF in .NET 4 hat jetzt eine Zeitspanne von Zeichenfolgen http://msdn.Microsoft.com/en-us/library/ee372286.aspx

Ich benutze das folgende <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />

12
Ira

Ich bin mir bewusst, dass diese Frage jetzt alt ist, aber ich bin überrascht, dass niemand diese einfache StringFormat vorgeschlagen hat, die direkt auf eine TimeSpan angewendet werden kann:

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

Wenn Sie StringFormat in einem Label verwenden möchten, das die Content-Eigenschaft verwendet, können Sie ContentStringFormat verwenden, um Ihre Zeitspanne zu formatieren:

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