2009-06-29 1 views
1

Ich versuche, den SystemColors.HighlightBrushKey immer ein wenig dunkler als der Hintergrund der ausgewählten Zeile festzulegen. Deshalb im, mit diesem Code:So richten Sie den SystemColors.HighlightBrushKey in WPF mit einem Konverter ein

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

Das Problem ist, dass der Konverter nie genannt wird ... Weiß jemand, wie der Hintergrund der ausgewählten Zeile setzen etwas dunkler als es vor der Auswahl war es?

Jede Hilfe wird geschätzt!

aktualisieren

Es sieht aus wie seine Arbeits aber leider nicht vollständig. ich den Konverter korrigiert habe wie folgt aussehen:

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

Das Problem ist jetzt, dass der Konverter nur einmal aufgerufen wird. Ich meine, wenn ich das Programm starte und auf irgendeine Zeile klicke, wird der Converter aufgerufen. Wenn ich dann in eine andere Zeile klicke, wird DataGrid oder Control the Converter nicht aufgerufen.

Irgendeine Idee, wie man das repariert?

Antwort

2

Das Problem ist in dieser Bindung:

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

Es gibt keine Source und die Background Eigenschaft wird nicht im aktuellen Kontext vorhanden ist. Ändern Sie es zu diesem:

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

Und Ihr Konverter wird aufgerufen werden. Sie haben zwar Bugs in Ihrem Konverter, aber das sollte Ihnen den Einstieg erleichtern. Sehen Sie sich auch:

  • Einfrieren der Bürste
  • den Pinsel Cachen (wenn Sie dies tun viel in Ihre app)
Verwandte Themen