[c#] 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



답변

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


답변

형식 문자열은 작업 할 의도 DateTime가 아닌를 TimeSpan.

DateTime.Now대신 사용할 코드를 변경할 수 있습니다 . 귀하의 xaml은 괜찮습니다.

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

최신 정보

그리고 다음과 같이 .Net 4 형식 a TimeSpan에서 :

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


답변

풀에 추가하기 위해이 바인딩을 성공적으로 사용하여 프로덕션 WPF 앱에 TimeSpan을 표시합니다.

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

백 슬래시를 올바르게 잡으려고 시도했습니다. 🙂


답변

StringFormat형식 문자열 형식이어야합니다. 이 경우 다음과 같습니다.

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

참고 : 총 시간 및 분 수를 표시하고 시간 범위가 24 시간을 초과하는 경우 접근 방식에 대한주의 사항이 있습니다 . 해결 방법은 다음과 같습니다 .


답변

다중 바인딩의 경우 .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을 “{HH \ : \ mm \ 0 SS를} {} -> {1 : HH : \ mm \ SS}”수 없습니다 MultiBinding에 작업이 빈 결과가 발생합니다.


답변

나는이 질문이 이제 오래되었다는 것을 알고 있지만 아무도 직접적으로 StringFormat작동 할 간단한 제안을 제안하지 않았다는 것에 놀랐습니다 TimeSpan.

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


답변

.NET 4의 WPF에는 이제 문자열 http://msdn.microsoft.com/en-us/library/ee372286.aspx의 시간 범위가 있습니다 .

나는 다음을 사용하고있다 <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />