2013-03-15 100 views
3

我想創建某種標籤與發光的背景。爲了實現這一點,我決定在內容控件上使用樣式。發光效果來自兩個DropShadowEffects,我希望綁定到內容控件的Foreground PropertyForeground Property的類型爲Brush,而DropShadowEffect.Color的類型爲Color,所以我需要在這兩者之間進行轉換。正確綁定一個IValueConverter

每當我嘗試通過轉換器設置發光顏色時,發光效果會保持爲黑色。看起來轉換器代碼甚至沒有通過。我確實在轉換器中返回了預定義的顏色(不轉換),甚至添加了一個Debug.Break(),但無濟於事。

你能告訴我我做錯了什麼,或者是否有其他可能更好的方法來實現帶有發光背景的標籤。

轉換器:

public class ColorToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) return null; 

     if (value is Color) 
     { 
      Color color = (Color)value; 
      BrushConverter bc = new BrushConverter(); 
      return bc.ConvertFrom(color); 
     } 

     Type type = value.GetType(); 
     throw new InvalidOperationException("Unsupported type ["+type.Name+"]");    
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 

     if (value is Brush) 
     { 
      Brush brush = (Brush)value; 
      BrushConverter bc = new BrushConverter(); 
      return bc.ConvertTo(brush, typeof(Color)); 
     } 

     Type type = value.GetType(); 
     throw new InvalidOperationException("Unsupported type ["+type.Name+"]");    
    } 
} 

在資源字典:

<local:ColorToBrushConverter x:Key="Color2BrushConverter" /> 

<Style x:Key="ContentControlGlowStyle" TargetType="{x:Type ContentControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ContentControl}"> 
       <Border> 
        <Border.Effect> 
         <DropShadowEffect 
           BlurRadius="15" 
           Color="{Binding Path=Foreground, Converter={StaticResource Color2BrushConverter}}" 
           ShadowDepth="2" 
           Direction="0"/> 

        </Border.Effect> 

        <TextBlock Name="Highlight" Foreground="{TemplateBinding Foreground}" Text="{TemplateBinding Content}" Margin="10,5,0,0"> 
         <TextBlock.Effect> 
          <DropShadowEffect 
           BlurRadius="15" 
           Color="{Binding Path=Foreground,Converter={StaticResource Color2BrushConverter}}" 
           ShadowDepth="2" 
           Direction="0"/> 

         </TextBlock.Effect> 

        </TextBlock> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

和XAML:

<ContentControl Name="cc2" Style="{DynamicResource ContentControlGlowStyle}" 
    FontSize="24" 
    Foreground="LightBlue" 
    Background="LightBlue" 
    Content="some content to display" 
    FontFamily="Verdana" /> 
+1

你應該看看輸出窗口,看看它是否顯示任何異常。這可以讓你更瞭解正在發生的事情。 – TYY 2013-03-15 14:26:08

+0

VS不會抱怨輸出窗口中的綁定。 – 2013-03-15 14:28:04

+0

想到的另一件事是設置一個相對顏色綁定的來源。 – TYY 2013-03-15 14:32:37

回答

1

要解決你所面對你需要設置相對問題源到顏色綁定。知道這不是你的轉換器的問題的訣竅是它從來沒有被調用的事實,並且VS不吐出任何錯誤,這意味着已經選擇了默認值。

1

首先,您的轉換器看起來倒退了 - 您正在將Brush轉換爲Color,並且您已創建ColorToBrushConverter來這樣做。

此外,我不知道爲什麼你要重新定義ContentControl風格的控制模板。你應該設置一個DropShadowEffect,它的Color綁定到ContentControlForeground

試試這個:

public class BrushToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var solidColorBrush = value as SolidColorBrush; 
     if (solidColorBrush == null) return null; 

     return solidColorBrush.Color; 
    } 

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

<local:BrushToColorConverter x:Key="BrushToColorConverter" /> 

<Style x:Key="ContentControlGlowStyle" TargetType="{x:Type ContentControl}"> 
    <Setter Property="Effect"> 
     <Setter.Value> 
      <DropShadowEffect 
         BlurRadius="15" 
         Color="{Binding Foreground,RelativeSource={RelativeSource AncestorType=ContentControl}, Converter={StaticResource BrushToColorConverter}}" 
         ShadowDepth="2" 
         Direction="0"/> 
      </Setter.Value> 
     </Setter> 
</Style> 

使用它像

<ContentControl 
    Foreground="Yellow" 
    Style="{DynamicResource ContentControlGlowStyle}"> 
    <TextBlock Text="TEST" FontSize="72"/> 
</ContentControl> 
+0

轉換器的名稱有點混亂,是的:)重新定義控制模板的原因是,僅僅在文本塊中添加投影效果只會添加少量的光暈。在邊框周圍添加陰影也會給我想要的金額。TYY已經解決了綁定的問題,但是+1解決方案是有用和正確的。謝謝。 – 2013-03-15 15:35:37

相關問題