将System.Windows.Media.Color绑定到TextBlock.Foreground的方法是什么?

6
当我这样做时,我得到了以下结果:
“无法创建默认转换器来执行'单向'类型之间的转换'System.Windows.Media.Color'和'System.Windows.Media.Brush'。考虑使用Binding的Converter属性。“
有人知道如何解决这个问题吗?
为什么WPF不能自动转换,因为我正在使用WPF颜色,而不是System.Drawing.Color。
编辑:
Xaml代码:
<GridViewColumn Width="120" Header="Info">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock HorizontalAlignment="Center" Text="{Binding Info, Mode=OneWay}" Foreground="{Binding MessageColor, Mode=OneWay}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

请问您能否展示一下您设置颜色的XAML代码? - as-cii
1个回答

9

默认的Brush类型转换器,即使在WPF版本中也不支持Color。它只支持字符串的转换。

您需要创建一个自定义的IValueConverter,将Color转换为SolidColorBrush并返回。

public class ColorToBrushConverter : IValueConverter {

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        if (!(value is Color))
            throw new InvalidOperationException("Value must be a Color");
        return new SolidColorBrush((Color)value);
    }

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

}

谢谢,写完后我该如何使用它?它将在XAML中使用还是实际的颜色属性(MessageColor)代码中使用? - Joan Venge
@Joan - 在绑定中使用它的方式如下 "{Binding MessageColor, Mode=OneWay, Converter={StaticResource ColorToBrushConverter}}". 您需要将 xmlns 添加到您的 CLR 命名空间中,然后在使用它的地方上面的某个位置添加 ColorToBrushConverter 作为资源 (例如 <myns:ColorToBrushConverter x:Key="ColorToBrushConverter" /> )。 - CodeNaked
1
@Joan - 这里有一个例子。请注意xmlns:custom如何映射到定义转换器的CLR命名空间?如果在同一个程序集中,则程序集部分是可选的(即xmlns:custom =“clr-namespace:SDKSample”) - CodeNaked
@Joan - 至于放在哪里,这真的取决于你的项目。如果它们可以被应用程序的各个部分重复使用,通常会放在共享程序集中。 - CodeNaked
谢谢CodeNaked,我明白了。 - Joan Venge
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接