wpf - 从转换器返回动态资源

标签 wpf ivalueconverter dynamicresource

我想根据 bool 状态(在本例中为复选框的状态)更改WPF控件的颜色。
只要我正在使用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进行更改。
有没有办法使返回值动态化,还是我需要重新考虑设计?

最佳答案

您不能从转换器返回动态的东西,但是如果您的唯一条件是 bool 值,则可以使用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>

如果现在更改具有该键的资源,则背景也应更改。

关于wpf - 从转换器返回动态资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7609979/

相关文章:

c# - 集合属性 ConverterParameter 为空

.net - WPF BooleanToVisibilityConverter 在 false 时转换为隐藏而不是折叠?

wpf - 如何在 WPF 中更改 DynamicResource

wpf - 有没有办法让 DynamicResource 对于 ResourceDictionary 中的 Freezable 是动态的?

.net - WPF 动态资源示例

c# - OnPropertyChanged 不编译

wpf - 为什么我的带有 DrawingBrush 填充绑定(bind)到前景色的 ToggleButton 不起作用? VS2012

c# - 将 ValueConverter 存储到变量

WPF:用户控件的命令和命令参数

wpf - 如何以编程方式使用EventTrigger和InvokeCommandAction?