3

背景が光るある種のラベルを作成しようとしています。これを実現するために、コンテンツコントロールでスタイルを使用することにしました。グロー効果は、コンテンツコントロールDropShadowEffectsのにバインドしたい2つから来ています。Foreground PropertyForeground PropertyタイプBrushであり、DropShadowEffect.ColorはタイプColorであるため、これら2つを変換する必要があります。

コンバーターを介してグローカラーを設定しようとすると、グロー効果は黒のままになります。コンバーターコードが渡されることさえないようです。コンバーターで事前定義された色(変換なし)を返し、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" />
4

2 に答える 2

1

直面している問題を修正するには、相対ソースをカラーバインディングに設定する必要があります。コンバーターの問題ではないことを知る秘訣は、コンバーターが呼び出されることはなく、VSがエラーを吐き出さないという事実です。これは、デフォルトが選択されたことを意味します。

于 2013-03-15T15:02:04.417 に答える
1

まず、コンバーターは逆方向に見えます。つまり、をに変換し、BrushそのためColorにを作成しましたColorToBrushConverter

ContentControlまた、なぜスタイルでコントロールテンプレートを再定義しているのかわかりません。'sにバインドされてDropShadowEffectいるを設定する必要があります。ColorContentControlForeground

代わりにこれを試してください:

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>
于 2013-03-15T15:10:11.770 に答える