2011-01-14 48 views
2

如何在XAML达到这样的效果:透明系统的颜色在梯度(WPF)

<LinearGradientBrush x:Key="BrightSeparatorGradient" StartPoint="0.0, 0.5" EndPoint="1.0, 0.5"> 
     <GradientStop Offset="0.0" Color="{StaticResource {x:Static SystemColors.ControlLightColorKey}}" /> <!-- But fully transparent --> 
     <GradientStop Offset="0.5" Color="{StaticResource {x:Static SystemColors.ControlLightColorKey}}" /> 
     <GradientStop Offset="1.0" Color="{StaticResource {x:Static SystemColors.ControlLightColorKey}}" /> <!-- But fully transparent --> 
    </LinearGradientBrush> 

我试图创建两个电刷分别与适当的颜色和不透明度设置,以在0.0和1.0,但编译器拒绝将Brush作为Color(这很有逻辑,第二个想法:))。

此致敬礼 - Spook。

回答

6

我会创建一个MarkupExtension,需要一个Color并使用指定的不透明度返回Color

public class OpacityExtension : MarkupExtension 
{ 
    private readonly Color color; 
    public byte Opacity { get; set; } // defaults to 0, so you don't have 
             // to set it for the color to be transparent 

    public OpacityExtension(Color color) 
    { 
     this.color = color;   
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return Color.FromArgb(Opacity, color.R, color.G, color.B); 
    } 
} 

然后使用它像这样:

<LinearGradientBrush x:Key="BrightSeparatorGradient" StartPoint="0.0, 0.5" EndPoint="1.0, 0.5"> 
    <GradientStop Offset="0" Color="{lcl:Opacity {StaticResource {x:Static SystemColors.ControlLightColorKey}}}" /> 
    <GradientStop Offset=".5" Color="{StaticResource {x:Static SystemColors.ControlLightColorKey}}" /> 
    <GradientStop Offset="1" Color="{lcl:Opacity {StaticResource {x:Static SystemColors.ControlLightColorKey}}}" /> 
</LinearGradientBrush> 
+0

我有点盼望,这样的建设存在,但它是! XAML不会停止让我惊叹。这当然解决了我的问题,谢谢。顺便说一句 - 只是好奇 - 是否有一种方法可以实现同样的结果: Something here? – Spook 2011-01-15 00:21:04

+1

你也可以像这样使用MarkupExtension。如果你想能够像这样使用它,你将需要添加一个无参数的构造函数,并使Color字段成为一个可设置的属性。然后你可以这样做: ... – 2011-01-18 16:45:20

0

惊悚,

为什么以下不适合你?

<LinearGradientBrush x:Key="BrightSeparatorGradient" StartPoint="0.0, 0.5" EndPoint="1.0, 0.5"> 
    <GradientStop Offset="0.0" Color="Transparent" /> 
    <GradientStop Offset="0.5" Color="{StaticResource {x:Static SystemColors.ControlLightColorKey}}" /> 
    <GradientStop Offset="1.0" Color="Transparent" /> 
</LinearGradientBrush>