Как установить SystemColors.HighlightBrushKey в WPF с помощью конвертера - PullRequest
1 голос
/ 29 июня 2009

Я пытаюсь установить SystemColors.HighlightBrushKey всегда немного темнее, чем фон выбранной строки. Поэтому я использую этот код:

App.xaml:

    <WPFTests2:SelectionBackgroundConverter x:Key="SelectionBackgroundConverter"/>

    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Background, Converter={StaticResource SelectionBackgroundConverter}}"/>

</Application.Resources>

Window1.xaml:

<Window x:Class="WPFTests2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
<Grid>
    <ListBox x:Name="LB" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Grid>

Window1.xaml.cs:

using System; 
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;

namespace WPFTests2
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        LB.Items.Add("Text1");
        LB.Items.Add("Text2");
        LB.Items.Add("Text3");
        LB.Items.Add("Text4");
        LB.Items.Add("Text5");
    }
}

public class SelectionBackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            SolidColorBrush brush = (SolidColorBrush)value;
            Color newCol = brush.Color;
            newCol.R -= 10;
            newCol.G -= 10;
            newCol.B -= 10;
            BrushConverter conv = new BrushConverter();
            Brush newBrush = (Brush)conv.ConvertTo(newCol, typeof(Brush));
            return newBrush;
        }
        return Brushes.Transparent;
    }

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

Проблема в том, что конвертер никогда не вызывается ... Кто-нибудь знает, как установить фон для выбранной строки немного темнее, чем он был до его выбора?

Любая помощь приветствуется!

Обновление

Похоже, это работает, но, к сожалению, не полностью. Я исправил конвертер, чтобы он выглядел так:

public class SelectionBackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            SolidColorBrush brush = (SolidColorBrush)value;
            Color newCol = brush.Color;
            newCol.R -= 10;
            newCol.G -= 10;
            newCol.B -= 10;
            return new SolidColorBrush(newCol);
        }
        return Brushes.Transparent;
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, CultureInfo culture)
    {
        // we don't intend this to ever be called
        return null;
    }

Теперь проблема в том, что конвертер вызывается только один раз. Я имею в виду, если я запускаю Программу и нажимаю на любую строку, которую вызывает Конвертер. Если я затем нажму на другую строку, DataGrid или Control the Converter не будут вызваны.

Есть идеи как это исправить?

1 Ответ

2 голосов
/ 29 июня 2009

Проблема в этой привязке:

Color="{Binding Background, Converter={StaticResource SelectionBackgroundConverter}}"

Нет Source, и свойство Background не будет существовать в текущем контексте. Измените это на это:

Color="{Binding Source={x:Static SystemColors.HighlightBrush}, Converter={StaticResource SelectionBackgroundConverter}}"

И ваш конвертер будет называться. У вас есть ошибки в вашем конвертере, но это должно помочь вам начать. Также учтите:

  • замораживание кисти
  • кэширование кисти (если вы часто делаете это в своем приложении)
...