web-dev-qa-db-ja.com

ブラシを色に変換する

BrushオブジェクトをColorに変換して、ボタンのクリックでxamlボタンの背景色を_light color_に変更できるようにしますが、System.Windows.Forms.ControlPaint.Light()は引数としての色。

これを達成するための代替手段はありますか?

12
Robins Gupta

Colorを軽量化するために、巨大なWindows.Forms dll justを参照する必要はありません。簡単に言うと、各値に同じ係数を掛けるだけです。

private Color AdjustBrightness(double brightnessFactor)
{
    Color originalColour = Color.Red;
    Color adjustedColour = Color.FromArgb(originalColour.A, 
        (int)(originalColour.R * brightnessFactor), 
        (int)(originalColour.G * brightnessFactor), 
        (int)(originalColour.B * brightnessFactor));
    return adjustedColour;
}

もちろん、これはいくつかの方法で改善される可能性があります(そうすべきです)が、あなたはそのアイデアを理解します。実際、値が255を超えるとExceptionがスローされますが、きちんと対処できると確信しています。次に、明るくする必要があるBrushのタイプを確認するだけです。

if (brush is SolidColorBrush) 
    return new SolidColorBrush(AdjustBrightness(((SolidColorBrush)brush).Color));
else if (brush is LinearGradientBrush || brush is RadialGradientBrush) 
{
    // Go through each `GradientStop` in the `Brush` and brighten its colour
}
8
Sheridan

ブラシのA、RGB値を取得してから、それらをSystem.Drawing.Color.FromARGB()疑似コードに渡すことができます。

_Brush br = Brushes.Green;
byte a = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).A;
byte g = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).G;
byte r = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).R;
byte b = ((Color)br.GetValue(SolidColorBrush.ColorProperty)).B;
System.Windows.Forms.ControlPaint.Light(
    System.Drawing.Color.FromArgb((int)a,(int)r,(int)g,(int)b));
_

私はWPFの専門家ではありませんが、心に留めておく必要があると思う主なことは、System.Drawing.Color.FromArgb()またはSystem.Drawing.Color.FromName()を使用することです。

9
davidsbro

私の場合、私はこれを次のように行いました(拡張メソッド):

_public static class BrushExtension
{

    public static Color GetColor(this Brush brush)
    {
        return new Pen(brush).Color;
    }

}
_

そしてColor brushColor = myBrush.GetColor();のように呼び出します

6
Joel

これを試して:

        Brush brush = Brushes.Yellow;
        Color color = ((SolidColorBrush) brush).Color;