Windows Phone 8中用于颜色的条件StaticResource

时间:2014-04-28 13:38:04

标签: c# wpf silverlight windows-phone-8 staticresource

在WP8中,我想根据绑定中的布尔属性将TextBlock的前景颜色设置为不同的颜色。 此外,我还想使用StaticResource作为颜色。

我已经研究过的一种可能性是使用ValueConverter,但到目前为止还没有使用StaticResources。 我尝试的代码类似于:

<TextBlock Foreground="{Binding IsBlue, Converter={StaticResource BoolToColorConverter}}" />

我的转换器(我没想到返回一个字符串会起作用但决定测试它):

public class BoolToColorConverter : IValueConverter{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
        return (value is bool && (bool)value) ? "{StaticResource PhoneAccentBrush}" : "{StaticResource PhoneSubtleBrush}";
        }
}

此外,我研究了使用DataTriggers,但我发现WP8并没有直接支持它们。

我还没有尝试过依赖属性,因为我想首先确保我没有错过更简单,更明显的解决方法。

创建它的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您有两种方法可以解决此问题:

您可以通过附加属性扩展转换器,这些属性将由绑定

填充
public class BooleanToBrushConverter
        : IValueConverter
    {
        public Brush TrueBrush { get; set; }
        public Brush FalseBrush { get; set; }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool)
            {
                return (bool) value
                    ? TrueBrush
                    : FalseBrush;
            }

            return value;
        }

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

现在您可以通过页面资源

对其进行初始化
<BooleanToBrushConverter x:Key="BooleanToBrushConverter" TrueBrush="{StaticResource PhoneAccentBrush}" FalseColor="{StaticResource PhoneSubtleBrush}" />

使用它就像

一样简单
<TextBlock Foreground="{Binding IsBlue, Converter={StaticResource BooleanToBrushConverter}}" />

第二个解决方案是修复代码以从应用程序资源中恢复画笔

public class BoolToColorConverter
  : IValueConverter{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

        return (value is bool && (bool)value) ? Application.Current.Resources["PhoneAccentBrush"] : Application.Current.Resources["PhoneSubtleBrush"];
        }
}