2013-03-02 2 views
0

Я пытаюсь использовать конвертер внутри ResourceDictionary. Вот код, у меня есть:IValueConverter в ResourceDictionary

<Window x:Class="Metro.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:cnv="clr-namespace:Metro.converters"> 
    <Window.Resources> 
     <cnv:DarkenColorConverter x:Key="Darken" /> 
     <Color x:Key="Red">#FF0000</Color> 
     <SolidColorBrush Color="{StaticResource Red}" 
         x:Key="Accent" /> 
     <SolidColorBrush Color="{Binding Source={StaticResource Red}, Converter={StaticResource ResourceKey=Darken}}" 
         x:Key="DarkAccent" /> 
    </Window.Resources> 
    <StackPanel> 
     <Grid Background="{StaticResource Accent}"> 
      <TextBlock>grid 1</TextBlock> 
     </Grid> 
     <Grid Background="{StaticResource DarkAccent}"> 
      <TextBlock>grid 2</TextBlock> 
     </Grid> 
    </StackPanel> 
</Window> 

Вот преобразователь:

public class DarkenColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Brushes.Blue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Brushes.Gray; 
    } 
} 

Но почему-то не работает. Как только я использую конвертер внутри Grid непосредственно, все работает отлично:

<Grid Background="{Binding Source={StaticResource Red}, Converter={StaticResource ResourceKey=Darken}}"> 
     <TextBlock>grid 2</TextBlock> 
    </Grid> 

What`s неправильно с первым образцом XAML?

ответ

1

В первом преобразовании вы преобразуете Color, один в Grid является преобразование SolidColorBrush.

Вам также придется изменить свой конвертер, чтобы принять цвет.

public class DarkenColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     double percentage = 0.8; 
     if (parameter != null) 
     { 
      double.TryParse(parameter.ToString(), out percentage); 
     } 

     if (value is SolidColorBrush) 
     { 
      Color color = (value as SolidColorBrush).Color; 
      return new SolidColorBrush(Color.FromRgb((byte)(color.R * percentage), (byte)(color.G * percentage), (byte)(color.B * percentage))); 
     } 
     else if (value is Color) 
     { 
      Color color = (Color)value; 
      return Color.FromRgb((byte)(color.R * percentage), (byte)(color.G * percentage), (byte)(color.B * percentage)); 
     } 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
+0

Спасибо за вашу помощь еще раз. Я уже нашел свою ошибку несколько минут назад, но не смог принять свой собственный ответ. – dhh

+0

Да, извините, я не видел вашего ответа до тех пор, пока не отправил сообщение, рад, что вы все разобрались. Счастливое кодирование :) –

0

Проблема была в неправильном обращении конвертера.

Работа преобразователя:

public class DarkenColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return Colors.Blue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter,  System.Globalization.CultureInfo culture) 
    { 
     return Colors.Gray; 
    } 
} 
Смежные вопросы