2009-06-29 12 views
1

J'essaie de définir le SystemColors.HighlightBrushKey toujours un peu plus sombre que l'arrière-plan de la ligne sélectionnée. Par conséquent im en utilisant ce code:Comment faire pour définir le SystemColors.HighlightBrushKey dans WPF avec un convertisseur

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; 
    } 
} 
} 

Le problème est que le convertisseur ne sera jamais appelé ... Est-ce que quelqu'un sait comment définir l'arrière-plan de la ligne sélectionnée un peu plus sombre qu'elle ne l'était avant de le sélectionner?

Toute aide est appréciée!

Mise à jour

Il ressemble à son travail, mais malheureusement pas tout à fait. J'ai corrigé le convertisseur pour ressembler à ceci:

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; 
    } 

Maintenant, le problème est que le convertisseur n'est appelé une fois. Je veux dire que si je démarre le programme et que je clique sur une ligne, le convertisseur est appelé. Si je clique ensuite sur une autre ligne, DataGrid ou contrôle le convertisseur n'est pas appelé.

Une idée Comment résoudre ce problème?

Répondre

2

Le problème est dans cette liaison:

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

Il n'y a pas Source, et la propriété Background n'existera pas dans le contexte actuel. Changez-le en:

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

Et votre convertisseur s'appellera. Vous avez des bugs dans votre convertisseur, mais cela devrait vous aider à démarrer. Voir également:

  • geler le pinceau
  • la mise en cache de la brosse (si vous faites cela beaucoup dans votre app)
Questions connexes