Вернуть динамический ресурс из конвертера - PullRequest
5 голосов
/ 30 сентября 2011

Я хочу изменить цвет элемента управления WPF в зависимости от состояния bool, в данном случае состояния флажка. Это работает нормально, пока я работаю со StaticResources:

Мой контроль

<TextBox Name="WarnStatusBox" TextWrapping="Wrap" Style="{DynamicResource StatusTextBox}" Width="72" Height="50" Background="{Binding ElementName=WarnStatusSource, Path=IsChecked, Converter={StaticResource BoolToWarningConverter}, ConverterParameter={RelativeSource self}}">Status</TextBox>

Мой конвертер:

[ValueConversion(typeof(bool), typeof(Brush))]

public class BoolToWarningConverter : IValueConverter
{
    public FrameworkElement FrameElem = new FrameworkElement();

    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {                      
        bool state = (bool)value;
        try
        {              
            if (state == true)
                return (FrameElem.TryFindResource("WarningColor") as Brush);
            else
                return (Brushes.Transparent);
        }

        catch (ResourceReferenceKeyNotFoundException)
        {
            return new SolidColorBrush(Colors.LightGray);
        }
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        return null;
    }
}

Проблема в том, что у меня есть несколько определений ресурса "WarningColor", зависящих от настройки дневного или ночного режима. Эти события не вызывают изменение цвета WarningColor. Есть ли способ сделать возвращаемое значение динамическим или мне нужно переосмыслить свой дизайн?

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Вы не можете вернуть что-то динамическое из конвертера, но если ваше единственное условие - логическое значение, вы можете легко заменить весь конвертер на Style, используя Triggers:

например

<Style TargetType="TextBox">
    <Setter Property="Background" Value="Transparent" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsChecked, ElementName=WarnStatusSource}" Value="True">
            <Setter Property="Background" Value="{DynamicResource WarningColor}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

Если теперь ресурс с этим ключом изменен, фон также должен измениться.

0 голосов
/ 07 ноября 2013

Способ возврата ссылки на динамический ресурс довольно прост с помощью конструктора DynamicResourceExtension и предоставления ему ключа ресурса.

Использование:

return new DynamicResourceExtension(Provider.ForegroundBrush);

Определение класса Provider должно содержатьключ:

public static ResourceKey ForegroundBrush 
{ 
    get 
    { 
        return new ComponentResourceKey(typeof(Provider), "ForegroundBrush"); 
    } 
}

И значение ключа будет объявлено в словаре ресурсов:

<ResourceDictionary
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:theme="clr-namespace:Settings.Appearance;assembly=AppearanceSettingsProvider">

<Color x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type theme:Provider}, ResourceId=ForegroundColor}">#FF0000FF</Color>

<SolidColorBrush x:Key="{ComponentResourceKey {x:Type theme:Provider}, ForegroundBrush}" Color="{DynamicResource {ComponentResourceKey {x:Type theme:Provider}, ForegroundColor}}" />
</ResourceDictionary>

Таким образом, преобразователь будет динамически назначать DynamicResource для свойства привязки в зависимости отпредоставлен ключ ресурса.

...