2

私は非常に原始的なカラーピッカーツールを持っています(WPF)。外観は次のとおりです。

ここに画像の説明を入力

ご覧のとおり、これらの非常に醜いスライダーで HSV または RGB によって色を設定できます :) の Fill プロパティRectangleが更新されます。

説明しない理由により、この ColorPicker は UserControl です。

大量の DependencyProperties (主に色操作用) があります: 色相、土、値、R、G、B。これらの値の混合色: RGBColor と HSVColor。

犯人のRGBColorは次のとおりです。

public Color RGBColor
    {
        get { return (Color)GetValue(RGBColorProperty); }
        set { SetValue(RGBColorProperty, value); }
    }

    // Using a DependencyProperty as the backing store for RGBColor.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty RGBColorProperty =
        DependencyProperty.Register("RGBColor", typeof(Color), typeof(SimpleColorPicker), new UIPropertyMetadata(Colors.Transparent, (d, e) =>
        {
            var colorpicker = d as SimpleColorPicker;
            if (e.NewValue != null && colorpicker != null)
            {
                
                var c = (Color)e.NewValue;

                if (c.R != colorpicker.R) colorpicker.R = c.R;
                if (c.G != colorpicker.G) colorpicker.G = c.G;
                if (c.B != colorpicker.B) colorpicker.B = c.B;

                colorpicker.RGBBrush = new SolidColorBrush(colorpicker.RGBColor);

                if (colorpicker._fromRGB)
                {
                    var hsv = HSVColor.FromColor(c);
                    if (colorpicker.HSVColor == null || !colorpicker.HSVColor.Equals(hsv))
                        colorpicker.HSVColor = hsv;
                }

                colorpicker.forceDisplayRefresh();
            }

        }));

XAML 部分では、RGBColor を Rectangle に取得するために次を使用します。

<Rectangle Height="100" x:Name="DisplayRectangle">
    <Rectangle.Fill>
        <SolidColorBrush Color="{Binding RGBColor, Mode=OneWay}" />
    </Rectangle.Fill>
</Rectangle>

(この時点での DataContext はコントロール自体です。これは、すべてのバインディングで FindAncestor を使用したくなかったためです。したがって、ColorPicker コンストラクターではLayoutRoot.DataContext = this;、LayoutRoot がコントロールのルート Grid になります。)

このコントロールをビューで使用しようとしています。INotifyPropertyChanged通知プロパティを実装して持つビュー用の VM があります (それはどのように呼び出されますか?)

public Color Color
{
    get { return _color; }
    set
    {
        _color = value;
        RaisePropertyChanged(() => Color);
    }
}

このプロパティを Colorpicker で編集したいと思います (DataContext は VM です)。

<base:SimpleColorPicker RGBColor="{Binding Color}"/>

編集自体は機能します。Colorカラーピッカーのスライダーを調整すると、プロパティが VM に設定されます。

ただし、既に色が設定されている VM をロードするRectangleと、更新されません。スライダーは動作し、すべてがDependencyProperties正しい値に設定されますが、Rectangle の Fill は変化しません。(Transparentのデフォルト値のままですRGBColor DependencyProperty)。(繰り返しますが、読み込み後にスライダーを調整すると、Rectangle が再び更新されます...)

すでに失敗したもの:

  • Brush を使用して、Fill プロパティを直接バインドしようとしました (Fill.Color の代わりに)
  • Rectangle.Fill のバインディングを直接更新しようとしました

これを機能させるために他に何がありますか?

4

0 に答える 0