web-dev-qa-db-ja.com

XAMLでTimeSpanをフォーマットする方法

TimeSpanプロパティにバインドされているテキストブロックをフォーマットしようとしています。プロパティがDateTime型の場合は機能しますが、TimeSpanの場合は失敗します。コンバーターを使用して処理できます。しかし、私は他の選択肢があるかどうかを見つけようとしています。

サンプルコード:

public TimeSpan MyTime { get; set; }

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

Xaml

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

テキストブロックに時間と分のみが表示されることを期待しています。ただし、次のように表示されます。

19:10:46.8048860

86
biju

.NET 3.5では、代わりにMultiBindingを使用できます

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

更新
コメントに答えるため。

時間または分が0〜9の場合でも2桁を出力するには、{0}の代わりに{0:00}を使用できます。これにより、時刻12:01の出力が12:1ではなく12:01になります。
01:01を1:01として出力する場合は、StringFormat="{}{0}:{1:00}"

また、 条件付き書式設定 を使用して、分のマイナス記号を削除できます。 {1:00}の代わりに{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

フォーマット文字列は、DateTimeではなく、TimeSpanで機能することを目的としています。

代わりにDateTime.Nowで動作するようにコードを変更できます。あなたのxamlは大丈夫です:

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

更新

そして 。Net 4 からTimeSpanを次のようにフォーマットします:

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

プールに追加するために、このバインディングを使用して、実稼働WPFアプリでTimeSpanを表示しています。

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

バックスラッシュを正しくしようといくつか試みました:)

41
Cygon

StringFormat は、フォーマット文字列の形式である必要があります。この場合、次のようになります。

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

注:合計時間数と分数を表示する場合、タイムスパンがたまたま24時間を超えている場合、アプローチには警告があります: ここに回避策があります

21
Peter Lillevold

マルチバインディングの場合、.NET 4以降に注意する必要があります。

.NET 4.6でテストされた以下の短い概要:

正規バインディング:

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

マルチバインディング:

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

または、マルチバインディングで'の代わりに"を使用できます。

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

注:StringFormat = "{} {0:hh \:\:mm \:ss}-> {1:hh \:mm \:ss}"not MultiBindingで動作します。これにより、結果が空白になります。

14
juFo

.NET 4のWPFには文字列からのタイムスパンがあります http://msdn.Microsoft.com/en-us/library/ee372286.aspx

次の<TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />を使用しています

12
Ira

私はこの質問が今では古いことを知っていますが、StringFormatで直接動作するこの単純なTimeSpanを誰も提案していないことに驚いています:

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

Contentプロパティを使用するラベルでStringFormatを使用する場合は、ContentStringFormatを使用してタイムスパンをフォーマットできます。

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