我的想法是使用WPF默认按钮使用图像作为不透明度蒙版并让前景笔刷改变其颜色。我想仍然有背景,这就是问题所在,因为无论我如何设计风格,背景总会消失。要么这是不可能的,因为不透明蒙版不能改变它的目标,只是作用于整个控件,或者我遗漏了一些东西。
这是我的风格。我试图保持它相当基本。
struct parser
{
struct node;
// ...
};
我所拥有的只是在边框内嵌套标签。我想要的是模板(Button)控件的opacity属性,只影响标签的opacity属性。但这似乎并没有发生。相反,它似乎会影响默认按钮样式的所有内容。
我尝试将OverridesDefaultStyle设置为True,但没有改变任何内容。
我知道我已经可以通过其他方式做到这一点。但我的目标是制作一个快捷按钮,可以使用文本或图像作为前景。图像颜色来自前景画笔。如果我不能在这里得到答案,我很可能只是使用附加属性并将标签不透明蒙版绑定到那个,但我再次完全以这种风格完成它。
欢迎任何建议。谢谢。
答案 0 :(得分:0)
对于Opacity
我使用Converter
。有了这个,我可以将SolidColorBrush
绑定到Foreground
或Background
。 Converter
获得目标为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();
}
}
希望能为您提供帮助和帮助。