Почему свойство TextBlock.Foreground в XAML не принимает цвет?

Я попытался запустить образцы, аналогичные тем, которые Чарльз Петцольд продемонстрировал в своей речи, но, к сожалению, я не могу получить свойство Foreground TextBlock, чтобы принять мой пользовательский 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-объект в качестве значения? Мне нужно еще одно преобразование в строку?

4 ответа

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

Я думаю TextBlock.ForeGround имеет тип System.Media.Brushes который содержит похожие базовые цвета.

Вы можете попробовать что-то вроде этого

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

Так как Foreground это не Color но Brush,

общий Brush Foreground { get; задавать; }

источник

Вы можете справиться с этим с помощью конвертера или найти ответ в этой теме: Как преобразовать цветной код в media.brush?

Попробуй это....

class MyConverter : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return new SolidColorBrush(Colors.Red);
    }
}
Другие вопросы по тегам