You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于转换器与枚举实现TextBlock前景色切换及TrainDelay格式化

嘿,我来帮你搞定这个TextBlock的显示需求!要实现根据TrainDelay的数值切换格式和前景色,咱们可以分两步来做:先完善你的时间格式转换器,再搞定动态颜色的逻辑。

1. 完善TimeSpanFormatConverter转换器

首先咱们把你写了一半的转换器补全,它需要把整数类型的TrainDelay(假设单位是秒)转换成带符号的mm:ss格式,完全匹配你要的显示效果:

public class TimeSpanFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // 先判断输入是否为有效整数
        if (value is int delaySeconds)
        {
            // 将秒数转换为TimeSpan
            TimeSpan delay = TimeSpan.FromSeconds(delaySeconds);
            // 格式化输出:负数显示"-mm:ss",正数显示"mm:ss",零显示"00:00"
            return delay.ToString(@"mm\:ss");
        }
        // 无效输入时返回默认准点状态
        return "00:00";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // 如果不需要双向绑定,直接抛出异常即可
        throw new NotImplementedException();
    }
}
2. 实现前景色动态切换

这里给你两种方案,你可以根据自己的习惯选择:

方案一:用XAML Style的DataTrigger(纯界面端处理)

这种方式不需要额外写转换器,直接在TextBlock的Style里通过触发器判断TrainDelay的数值,切换前景色:

<!-- 记得先引入System命名空间 -->
xmlns:sys="clr-namespace:System;assembly=mscorlib"

<TextBlock Text="{Binding TrainDelay, Converter={StaticResource TimeSpanFormatConverter}}">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <!-- 默认准点状态:深色 -->
            <Setter Property="Foreground" Value="#FF333333"/>
            
            <Style.Triggers>
                <!-- 延误状态:数值大于0时显示红色 -->
                <DataTrigger Binding="{Binding TrainDelay}" Value="{x:Static sys:Int32.Zero}" Comparison="GreaterThan">
                    <Setter Property="Foreground" Value="Red"/>
                </DataTrigger>
                <!-- 提前状态:数值小于0时显示绿色 -->
                <DataTrigger Binding="{Binding TrainDelay}" Value="{x:Static sys:Int32.Zero}" Comparison="LessThan">
                    <Setter Property="Foreground" Value="Green"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

方案二:用ValueConverter返回颜色(代码端处理)

如果你更习惯在代码里统一处理逻辑,可以新建一个颜色转换器,直接根据TrainDelay返回对应的前景色:

第一步:创建颜色转换器

public class DelayToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is int delaySeconds)
        {
            if (delaySeconds > 0)
                return Brushes.Red;       // 延误:红色
            else if (delaySeconds < 0)
                return Brushes.Green;     // 提前:绿色
            else
                return new SolidColorBrush(Color.FromRgb(51, 51, 51)); // 准点:深色
        }
        // 无效输入返回默认深色
        return new SolidColorBrush(Color.FromRgb(51, 51, 51));
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

第二步:在XAML中绑定使用

<!-- 先在资源中声明两个转换器 -->
<Window.Resources>
    <local:TimeSpanFormatConverter x:Key="TimeSpanFormatConverter"/>
    <local:DelayToColorConverter x:Key="DelayToColorConverter"/>
</Window.Resources>

<!-- 绑定Text和Foreground -->
<TextBlock Text="{Binding TrainDelay, Converter={StaticResource TimeSpanFormatConverter}}"
           Foreground="{Binding TrainDelay, Converter={StaticResource DelayToColorConverter}}"/>
最后注意事项
  • 记得把local命名空间替换成你转换器所在的项目命名空间(比如xmlns:local="clr-namespace:YourTrainApp")
  • 如果你的TrainDelay单位不是秒,把转换器里的TimeSpan.FromSeconds改成对应的FromMinutes或其他方法即可

内容的提问来源于stack exchange,提问作者Amibluesky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:54:13