是否可以更改OpacityMask属性在样式中作为控件的目标

时间:2016-10-20 04:16:44

标签: wpf xaml styles opacitymask

我的想法是使用WPF默认按钮使用图像作为不透明度蒙版并让前景笔刷改变其颜色。我想仍然有背景,这就是问题所在,因为无论我如何设计风格,背景总会消失。要么这是不可能的,因为不透明蒙版不能改变它的目标,只是作用于整个控件,或者我遗漏了一些东西。

这是我的风格。我试图保持它相当基本。

struct parser
{
    struct node;
    // ...
};

我所拥有的只是在边框内嵌套标签。我想要的是模板(Button)控件的opacity属性,只影响标签的opacity属性。但这似乎并没有发生。相反,它似乎会影响默认按钮样式的所有内容。

我尝试将OverridesDefaultStyle设置为True,但没有改变任何内容。

我知道我已经可以通过其他方式做到这一点。但我的目标是制作一个快捷按钮,可以使用文本或图像作为前景。图像颜色来自前景画笔。如果我不能在这里得到答案,我很可能只是使用附加属性并将标签不透明蒙版绑定到那个,但我再次完全以这种风格完成它。

欢迎任何建议。谢谢。

1 个答案:

答案 0 :(得分:0)

对于Opacity我使用Converter。有了这个,我可以将SolidColorBrush绑定到ForegroundBackgroundConverter获得目标为Parameter的{​​{1}}并返回opac颜色。

<强>转换器:

Opacity

<强> XAML:

public class ColorToOpacityConverter : IValueConverter
{
    // Takes a SolidColorBrush as value and double as parameter
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is SolidColorBrush)) return value;
        SolidColorBrush scb = new SolidColorBrush(((SolidColorBrush) value).Color);
        scb.Opacity = parameter as double? ?? 0.5;
        return scb;
    }

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

绑定不透明度的第二种方法(而不是<Style.Resources> <namespace:ColorToOpacityConverter x:Key="ColorToOpacityConverter" /> <system:Double x:Key="TargetOpacity">0.3</system:Double> </Style.Resources> <Label Foreground="{Binding Path=Foreground, StaticResource={StaticResource TemplatedParent}, Converter={StaticResource ColorToOpacityConverter}, ConverterParameter={StaticResource TargetOpacity}" )我使用StaticResource

对于绑定不透明度:

MultiValueConverter

<强> XAML:

public class ColorToDynOpacityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Any(v => v == DependencyProperty.UnsetValue)) return new SolidColorBrush();
        if (!(values[0] is SolidColorBrush) || !(values[1] is double)) {
            //Fake for DesignMode-Display
            if (DesignerProperties.GetIsInDesignMode(new DependencyObject())) return new SolidColorBrush(Colors.Aqua);
            throw new ArgumentException("expect values[0] as SolidColorBrush and values[1] as double.");
        }
        SolidColorBrush scb = new SolidColorBrush(((SolidColorBrush) values[0]).Color);
        scb.Opacity = (double) values[1];
        return scb;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

希望能为您提供帮助和帮助。