WPF: при действии установить цвет фона относительно текущего цвета - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть пользовательский WPF TreeView.Там TreeViewItem имеет цвет фона в зависимости от его типа.Я взял эту информацию из TreeViewItem.Name и использовал триггер, как вы можете видеть ниже.

Теперь, когда я выбираю элемент или наведите курсор мыши на элемент в TreeView, я хочу, чтобы элемент сохранил свой цвет, но былнемного ярче.В настоящее время, как показано ниже, я просто установил один и тот же цвет для всех элементов.

Как изменить этот код, чтобы сделать цвет зависания относительно того, который имеет элемент, независимо от того, какой это элемент?

<TreeView>
    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TreeViewItem">                                
                        <ControlTemplate.Triggers>

                            <Trigger Property="TreeViewItem.Name" Value="TypeA">
                                <Setter Property="Background" TargetName="Bd" Value="#8BADC5"/>
                            </Trigger>
                            <Trigger Property="TreeViewItem.Name" Value="TypeB">
                                <Setter Property="Background" TargetName="Bd" Value="#FFC3AF"/>
                            </Trigger>


                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" TargetName="Bd" Value="#A5243D"/>
                            </Trigger>
                            <Trigger Property="IsFocused" Value="True">
                                <Setter Property="Background" TargetName="Bd" Value="#A5243D"/>
                            </Trigger>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter TargetName="Bd" Property="Background" Value="#A5243D"/>
                            </Trigger>

                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Resources>
</TreeView>

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я предлагаю расширенную версию предложения мами, где легче сформулировать триггеры 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>
0 голосов
/ 01 декабря 2018

Я бы сделал это с помощью преобразователя значений.

public class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is SolidColorBrush) {
            // return the calculated new SolidColorBrush
        }
    }

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

И в части ресурса xaml:

<ColorConverter x:Key="ColorConverter/>

и в теле xaml:

<Setter TargetName="Bd" Property="Background" Value="{Binding Background, Converter={StaticResource ColorConverter}}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...