【问题标题】:Binding a Color to a DependencyProperty in UserControl将颜色绑定到 UserControl 中的 DependencyProperty
【发布时间】:2019-03-04 03:16:47
【问题描述】:

我有一个UserControl,它有一个Grid 和一个绑定的Background 属性。我的所有其他绑定都按预期工作,但由于某种原因,我在UserControl 中获得的唯一颜色是我为DependencyProperty 设置的默认值。

MainWindow.xaml 中引用UserControl

<controls:MyUserControl Title="{Binding Path=MyObjects[0].Title" MyControlColor="{Binding Path=MyObjects[0].Color}" />

Title 按预期显示,但颜色不变。

MyUserControl 代码(我使用MyControlColorBrush 作为颜色源,它只是将MyControlColor 转换为SolidColorBrush。代码向下。):

<Grid Background="{Binding Path=MyControlColorBrush, RelativeSource={RelativeSource AncestorType=UserControl}}">
    <TextBlock Text="{Binding Path=Title, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Grid>

MyUserControl.xaml.cs代码:

public Color MyControlColor
{
    get { return (Color)GetValue(MyControlColorProperty); }
    set { SetValue(MyControlColorProperty, value); }
}
    public static readonly DependencyProperty MyControlColorProperty = DependencyProperty.Register("MyControlColor", typeof(Color), typeof(MyUserControl), new PropertyMetadata(Colors.Black));

然后是一个将颜色转换为SolidColorBrush的属性:

public SolidColorBrush MyControlColorBrush
{
    get { return new SolidColorBrush(MyControlColor); }
}

关于我可能遗漏的任何想法?如果我检查MyControlColor 的值,它会显示正确的颜色,但Grid 的背景并没有从Black 改变。

【问题讨论】:

    标签: wpf colors


    【解决方案1】:

    与 MyControlColorBrush 的绑定仅在您的页面首次加载时发生一次。您与 MyObjects[0].Color 的绑定导致您的依赖项属性更新,但没有任何迹象表明您的应用程序的其余部分也需要更新 MyControlColorBrush。

    有几种方法可以实现这一点,最简单的可能是为您的画笔创建一个只读依赖属性,当您检测到颜色属性发生变化时更新该属性(这类似于 Width/ActualWidth属性工作)。您的控件将需要颜色的 DP:

    public Color MyControlColor
    {
        get { return (Color)GetValue(MyControlColorProperty); }
        set { SetValue(MyControlColorProperty, value); }
    }
    
    public static readonly DependencyProperty MyControlColorProperty =
        DependencyProperty.Register("MyControlColor", typeof(Color), typeof(MyUserControl),
            new PropertyMetadata(Colors.Black, OnColorChanged));
    

    然后是一个用于画笔的只读 DP:

    public Brush MyControlColorBrush
    {
        get { return (Brush)GetValue(MyControlColorBrushProperty); }
        protected set { SetValue(MyControlColorBrushPropertyKey, value); }
    }
    
    private static readonly DependencyPropertyKey MyControlColorBrushPropertyKey
            = DependencyProperty.RegisterReadOnly("MyControlColorBrush", typeof(Brush), typeof(MyUserControl),
                    new FrameworkPropertyMetadata(Brushes.Black, FrameworkPropertyMetadataOptions.None));
    
    public static readonly DependencyProperty MyControlColorBrushProperty = MyControlColorBrushPropertyKey.DependencyProperty;
    

    而且你会在你的颜色 DP 改变时更新画笔:

    private static void OnColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        (d as MyUserControl).MyControlColorBrush = new SolidColorBrush((Color)e.NewValue);
    }
    

    自定义控件中的 GUI 元素然后绑定到只读 DP,例如:

    <Grid Background="{Binding Path=MyControlColorBrush, RelativeSource={RelativeSource AncestorType=local:MyUserControl}}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    

    【讨论】:

    • 谢谢!我最终使用了其中的一部分,效果很好。我摆脱了常规的 ColorBrush 属性并用它创建了一个依赖属性,然后我创建了 ColorPropertyChanged 方法,并像这样分配了颜色......(来源为 MyUserControl).MyControlColorBrush = new SolidColorBrush((来源为 MyUserControl)。 MyControlColor);
    猜你喜欢
    • 2012-06-06
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2016-05-13
    • 2013-01-20
    • 2014-12-22
    相关资源
    最近更新 更多