2013-03-02 67 views
0

我試圖在ResourceDictionary中使用Converter。這是我的代碼:Resourcealm中的IValueConverter

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

什麼`錯的第一XAML樣?

回答

1

在第一次轉換要轉換Color,一個在Grid被轉換SolidColorBrush。您將不得不修改您的轉換器以接受Color。

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 2013-03-02 22:03:09

+0

是啊,對不起,我沒有看到你的答案,直到我發佈,很高興你把它全部排序。快樂編碼:) – 2013-03-02 22:04:29

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