为什么XAML中的TextBlock.Foreground属性不接受Color?

时间:2016-05-12 20:37:50

标签: c# wpf xaml user-interface markup-extensions

我试图运行样本,类似于Charles Petzold在speech中演示的样本,但不幸的是,我无法让TextBlock的Foreground属性接受我的自定义MarkupExtension,它只返回一个颜色:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel >
        <TextBlock Foreground="{local:MyConverter}"
                   Text="{Binding Source={x:Reference slider}, 
                                  Path=Value, 
                                  StringFormat='Rotation = {0:F2} degree'}">
        </TextBlock>
        <Slider x:Name="slider" Minimum="-360" Maximum="360"></Slider>
    </StackPanel>
</Window>

以下简单的Markup-Extension:

class MyConverter : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {            
        return System.Drawing.Color.Red;
    }
}

启动应用程序后,我得到一个XamlParseException内部异常,指出: {“'Color [Red]'不是属性'Foreground'的有效值。”}

我也尝试过返回一个实心画笔:return new SolidBrush(Color.Red);,但效果相同。我究竟做错了什么?如何让我的Foreground属性接受Color-object作为值?我是否需要另外转换为字符串?

4 个答案:

答案 0 :(得分:2)

class MyConverter : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {            
        return System.Media.Brushes.Red;
    }
}

我认为TextBlock.ForeGround的类型为System.Media.Brushes,其中包含相似的基色。

答案 1 :(得分:1)

因为Foreground不是Color而是Brush

  

public Brush Foreground {get;组; }

source

您可以使用转换器处理此问题,或在此主题中寻找答案:How to convert color code into media.brush?

答案 2 :(得分:1)

你可以尝试这样的事情

textBlock.Inlines.Add(new Run("Red") { Foreground = Brushes.Red });

答案 3 :(得分:0)

试试这个......

class MyConverter : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return new SolidColorBrush(Colors.Red);
    }
}