私は非常に原始的なカラーピッカーツールを持っています(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 のバインディングを直接更新しようとしました
これを機能させるために他に何がありますか?