2011-01-14 21 views
2

透過システム勾配の色(WPF)XAMLでこのような効果を達成する方法

<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> 

I 0.0および1.0に、それぞれ、適切な色及び不透明度が設定された2つのブラシを作成するために試みたが、コンパイラは色としてブラシを取ることを拒否しました(2番目の考えではかなり論理です)。

よろしくお願いいたします。

答えて

6

私はColorを受け取り、指定された不透明度でColorを返しMarkupExtension作成します。

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は私を驚かせるために止まらない。それはもちろん私の問題を解決する、ありがとう。ところで、ちょうど不思議なことですが、ここに何かという構造で同じ結果を得る方法がありますか? – Spook

+1

そのようなMarkupExtensionも使用できます。そのように使用できるようにするには、パラメータのないコンストラクタを追加し、Colorフィールドを設定可能なプロパティにする必要があります。 ... –

+0

{Lcl:Opacityを指定すると、 {StaticResource {x:Static ... "'System.Windows.Markup.StaticResourceHolder'型のコンテンツを ''型のオブジェクトに追加できません。 'System.Windows.Markup.StaticResourceHolder'オブジェクトでエラーが発生しました。しかし、{lcl:Opacity {x:Static ... を指定するとエラーになりません。 – Krimson

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> 
+2

これは#00FFFFFFから#FF8080FFのようなシステムカラーになるため動作しません。これにより、アルファチャンネルの色が薄くなるのではなく、白から青への移行が洗い流されます。 –

+0

入手しました。 @Abeによって提案された方法はかなり妥当です。 – Anvaka

関連する問題