我想根据 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/