使用转换器更改用户控件的背景颜色
本文关键字:控件 背景 颜色 用户 转换器 | 更新日期: 2023-09-27 18:31:07
我有一个用户控件,我想动态更改此控件的背景颜色。
当视图模型中的某个枚举被设置时,我希望颜色发生变化,所以我使用转换器将枚举转换为 SolidColorBrush。
当我将此转换器放在另一个控件中时,它工作正常。但是当我将其放置在 xaml 文件顶部的用户控件属性中时,它会给出错误。
<UserControl
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:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:ee="http://schemas.microsoft.com/expression/2010/effects"
mc:Ignorable="d"
xmlns:converters="clr-namespace:UserControlSolution.Converter"
x:Class="UserControlSolution.UserControlButton"
x:Name="UserControl"
Height="50"
VerticalAlignment="Top"
Background="{Binding CallStatus, Converter={StaticResource CallStatusBackgroundConverter}}"
Margin="2,0,0,5"
>
<UserControl.Resources>
<converters:CallStatusEnumToBackgroundColor x:Key="CallStatusBackgroundConverter"/>
<converters:StatusEnumToStatusResourceConverter x:Key="StatusIconConverter"/>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
<Style x:Key="SelectedStyle" TargetType="{x:Type WrapPanel}">
<Setter Property="Background" Value="Transparent"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="true">
<Setter Property="Background" Value="{Binding CallStatus, Converter={StaticResource CallStatusBackgroundConverter}}"/>
<Setter Property="Opacity" Value=".92"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" VerticalAlignment="Top" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
</Grid>
我的转换器只是从枚举转换为颜色
namespace UserControlSolution.Converter
{
[ValueConversion(typeof(CallEnum), typeof(SolidColorBrush))]
public class CallStatusEnumToBackgroundColor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch ((CallEnum)value)
{
case CallEnum.Connected:
return (SolidColorBrush)Application.Current.Resources["Red"];
case CallEnum.ConnectedIntern:
return (SolidColorBrush)Application.Current.Resources["Blue"];
case CallEnum.Hold:
return (SolidColorBrush)Application.Current.Resources["Orange"];
case CallEnum.Idle:
return (SolidColorBrush)Application.Current.Resources["DarkGrey"];
case CallEnum.OffRing:
return (SolidColorBrush)Application.Current.Resources["Yellow"];
default:
return null;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
把它放在资源之后,并从用户控件中删除绑定:
<UserControl.Background>
<SolidColorBrush Color="{Binding CallStatus, Converter={StaticResource CallStatusBackgroundConverter}}"/>
</UserControl.Background>
严格来说,接受的答案不是对 @robby-smet 的原始问题(和评论)的回答,即如何绑定到SolidColorBrush
。正确完成此操作的方式并不像@aSterX的回答中所建议的那样,而是
<UserControl.Background>
<SolidColorBrush>
<Binding Path="CallStatus"
Converter="{StaticResource CallStatusBackgroundConverter}}" />
</SolidColorBrush>
</UserControl.Background>
不管错误是什么(甚至可能是这样),我想指出的是,你真的应该在任何Converter
类中检查你的输入类型:
if (value == null || value.GetType() != typeof(YourRequiredType))
return DependencyProperty.UnsetValue;