2009-06-29 5 views
1

SystemColors.HighlightBrushKey를 항상 선택한 행의 배경보다 조금 더 어둡게 설정하려고합니다.WPF에서 변환기를 사용하여 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; 
    } 

지금 문제가 컨버터는 한 번만 호출되는 것입니다. 나는 프로그램을 시작하고 Converter가 호출 된 행을 클릭하면됩니다. 그런 다음 다른 행, DataGrid 또는 컨트롤을 클릭하면 변환기가 호출되지 않습니다.

어떤 문제를 해결하는 방법?

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

Source 없다, 그리고 Background 속성은 현재 컨텍스트에 존재하지 않습니다

답변

2

문제는이 바인딩에 있습니다. 이 값으로 변경하십시오 :

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

변환기가 호출됩니다. 그래도 변환기에 버그가 있지만 시작해야합니다. 또한 고려 : 브러시

  • 브러시를 캐싱을 동결

    (당신은이 앱에서 많이 할 경우)
  • 관련 문제