Я предлагаю расширенную версию предложения мами, где легче сформулировать триггеры IsMouseOver и т. Д.Он состоит из:
- преобразователя с несколькими значениями для расчета фоновой кисти, которая будет использоваться из базового значения, и некоторого параметра преобразования
- присоединенного свойства для хранения параметра (ов) преобразования
- в XAML, мультисвязывание
В качестве простого примера предположим, что используемый цвет должен быть рассчитан с помощью Color.Multiply с коэффициентом, определяемым состояниями IsMouseOver и т. Д.
Преобразователь нескольких значений:
public class MultiplyColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var baseColor = ((SolidColorBrush)values[0]).Color;
var factor = (float)values[1];
return new SolidColorBrush(Color.Multiply(baseColor, factor));
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Свойство параметра преобразования:
public class ColorTransform
{
public static float GetFactor(DependencyObject obj)
{
return (float)obj.GetValue(FactorProperty);
}
public static void SetFactor(DependencyObject obj, float value)
{
obj.SetValue(FactorProperty, value);
}
public static readonly DependencyProperty FactorProperty =
DependencyProperty.RegisterAttached("Factor", typeof(float), typeof(ColorTransform),
new FrameworkPropertyMetadata(1.0F,
FrameworkPropertyMetadataOptions.AffectsRender));
}
XAML:
<local:MultiplyColorConverter x:Key="MultiplyColorConverter"/>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeViewItem">
<Border x:Name="Bd">
<Border.Background>
<MultiBinding Mode="OneWay" Converter="{StaticResource MultiplyColorConverter}">
<Binding Path="BaseColor" Mode="OneWay"/>
<Binding RelativeSource="{RelativeSource Self}" Path="(local:ColorTransform.Factor)" Mode="OneWay"/>
</MultiBinding>
</Border.Background>
<TextBlock x:Name="Text" Text="{Binding}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="local:ColorTransform.Factor" Value="0.5"/>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="Bd" Property="local:ColorTransform.Factor" Value="0.5"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Bd" Property="local:ColorTransform.Factor" Value="0.3"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>