WPF:将静态资源绑定到用户控件中的依赖项属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF:将静态资源绑定到用户控件中的依赖项属性相关的知识,希望对你有一定的参考价值。

我有一个用户控件,它是一个图标容器。

<Rectangle x:Name="Rectangle"
           Width="{Binding SquareWidth}"
           Height="{Binding SquareWidth}"
           Fill="{Binding FillBrush}"
           DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}, Mode=OneWay}">
    <Rectangle.OpacityMask>
        <VisualBrush Visual="{Binding VisualItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Stretch="UniformToFill" />
    </Rectangle.OpacityMask>
</Rectangle>

在代码隐藏中:

    public static readonly DependencyProperty CanvasItemDependencyProperty =
        DependencyProperty.Register(nameof(VisualItem), typeof(Canvas),
            typeof(SquareIcon), new FrameworkPropertyMetadata());

    public Canvas VisualItem
    {
        get => GetValue(CanvasItemDependencyProperty) as Canvas;
        set => SetValue(CanvasItemDependencyProperty, value);
    }

图标绘图在资源字典中定义为Canvas项:

<Canvas x:Key="appbar_3d_3ds" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">
    <Path Width="32" Height="40" Canvas.Left="23" Canvas.Top="18" Stretch="Fill" Fill="{DynamicResource BlackBrush}" Data="F1 M 27,18L 23,26L 33,30L 24,38L 33,46L 23,50L 27,58L 45,58L 55,38L 45,18L 27,18 Z "/>
</Canvas>

我在主窗体中实例化我的用户控件,如下所示:

<controls:SquareIcon VisualItem="{StaticResource appbar_information_circle}" Width="16" Height="16" FillBrush="Black" SquareWidth="16" Margin="0,0,5,0"/>

但我得到的只是一个透明的方块。

如果我用“StaticResource appbar_information_circle”替换“Binding VisualItem”,则会显示图标。

我错过了什么?

答案

您没有遵循依赖项属性的强制命名约定。名为VisualItem的依赖项属性的标识符字段必须命名为VisualItemProperty,否则XAML解析器无法解析它。

public static readonly DependencyProperty VisualItemProperty =
    DependencyProperty.Register(
        nameof(VisualItem), typeof(Canvas), typeof(SquareIcon));

public Canvas VisualItem
{
    get => (Canvas)GetValue(VisualItemProperty)
    set => SetValue(VisualItemProperty, value);
}

在属性getter中使用as运算符没有用,因为属性值始终是Canvas。如果不是(这是一个编程错误),你会想要获得InvalidCastException而不是NullReferenceException。

您还应该考虑将依赖项属性的类型从Canvas更改为Visual。它可以以相同的方式工作,但在可以为属性分配哪些元素方面提供更大的灵活性。


请注意,在Visual Binding上设置Mode=TwoWayUpdateSourceTrigger=PropertyChanged是没有意义的。绑定应该如下所示:

<VisualBrush Visual="{Binding VisualItem}" .../>

以上是关于WPF:将静态资源绑定到用户控件中的依赖项属性的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 WPF 用户控件的依赖属性更新我的视图模型?

WPF ----在UserControl的xaml里绑定依赖属性

如何正确绑定到 MVVM 框架中用户控件的依赖属性

wpf 控件属性通过数据绑定到某个集合的某一个数据上。

具有依赖属性绑定到 DockPanel.Dock 附加属性的 WPF 自定义控件不起作用

WPF - 绑定到用户控件之间的列表框的选定项