2011-01-14 75 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>