web-dev-qa-db-ja.com

XAMLで名前付き色の透明度レベルを指定します

XAMLに、カスタムの透明度レベルが異なる名前付きの色からカラーオブジェクトを作成する方法はありますか?例えば.

<Label Background="{SkyBlue;220}" />

これが機能しないことはわかっていますが、例を引用したかっただけです。

14
dotNET

自分で答えを見つけたときの1つ。これが将来の読者のための正しい方法です:

<Label.Background>
    <SolidColorBrush Color="SkyBlue" Opacity=".9" />
</Label.Background>

Opacityの範囲は0〜1で、1は完全に不透明(不透明)です。

編集

@Daiのコメントに関して、このメソッドは、すでにある程度の透明度を設定しているカラーリソースを参照している場合、指定された色の透明度レベルをリセットまたはオーバーライドしません。たとえば、リソースの色がSkyBlueで、透明度が0.5に設定されていて、代わりに0.7に設定したい場合、上記の方法は直接機能しません。

この状況を処理するには、入力色のアルファ成分をリセットする小さなConverterを作成するだけです。このようなもの:

public class NoTransparencyConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    var C = ((Color)value);
    return Color.FromArgb(0xFF, C.R, C.G, C.B);
  }

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

次に、XAMLで使用します。

<SolidColorBrush Color="{Binding Path="YOUR_COLOR_RESOURCE" Converter={x:Static NoTransparencyConverter}}" Opacity=".9" />
30
dotNET

これに少し追加するだけです。はい、回答で示したように宣言型でOpacityを絶対に設定できますが、Dependency Propertyセットは必要ありません。Alpha値の上にRGBを利用することで、色の16進数で直接設定できます。一方、Blackの値があり、不透明度を付けたいとします。その値の最初の2オクテットを追加して、同じことを実現できます。

例として;

"#000000" =黒(SOLID)

ここで;

"#33000000" =黒(不透明度20%)

"#77000000" =黒(不透明度47%)

"#E5000000" =黒(不透明度90%)

Opacityプロパティがすぐに利用できない場合や不変として設定されている場合に、詳細を説明し、将来的に役立つ可能性があります。お役に立てれば。

ADDENDUM:アルファのようなプロパティへの設定は、要素全体に不透明度を設定するよりも常にパフォーマンスが高いことにも注意してください。これは、background-color: rgba(0,0,0,.5)のようなものが<div style="background: black;opacity: .5)と言うよりも良い習慣であるHTML/CSSシナリオにも当てはまります。

22
Chris W.