如何从 XAML 设置 WPF 用户控件属性?

如何从 XAML 设置 WPF 用户控件属性?

问题描述:

我正在尝试从 XAML 设置同一用户控件的多个实例的填充属性,以便区分它们.我在控件的 C# 代码隐藏中使用依赖属性,并在实例化控件时在 XAML 中引用该属性.这是我尝试过的简化示例,首先是用户控件的 XAML:

I'm trying to set the fill property of several instances of the same usercontrol from XAML in order to distinguish them. I'm using a dependency property in the C# codebehind of the control and referring to that in the XAML when I instantiate the control. Here's a simplified example of what I've tried, first the XAML of the user control:

<UserControl x:Class="RectangleFillUserControlTest.RectangleFillTest"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="50" d:DesignWidth="150">
    <Grid>
        <Rectangle x:Name="rect" HorizontalAlignment="Left" Height="50" Stroke="Black" VerticalAlignment="Top" Width="150"/>
    </Grid>
</UserControl>

现在是代码隐藏:

namespace RectangleFillUserControlTest
{
    public partial class RectangleFillTest : UserControl
    {
        SolidColorBrush fillBrush;

        public static readonly DependencyProperty FillColourProperty = DependencyProperty.Register
            ("FillColour", typeof(string), typeof(RectangleFillTest), new PropertyMetadata(string.Empty));

        public string FillColour
        {
            get { return (string)GetValue(FillColourProperty); }

            set
            {
                SetValue(FillColourProperty, value);
                if (value == "red") fillBrush = new SolidColorBrush(Colors.Red);
                else fillBrush = new SolidColorBrush(Colors.Green);
                rect.Fill = fillBrush;
            }
        }

        public RectangleFillTest()
        {
            InitializeComponent();
        }
    }
}

我在主窗口中实例化控件并尝试将填充颜色设置为红色:

I instantiate the control in the main window and try to set the fill colour to red:

<Window x:Class="RectangleFillUserControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:RectangleFillUserControlTest"
        Title="MainWindow" Height="350" Width="525">
    <Grid Background="#FF1D2CC3">
        <local:RectangleFillTest FillColour="red"/>
    </Grid>
</Window>

但矩形仍未填充,即使我运行该项目也是如此.请问有人可以帮忙吗?

But the rectangle remains unfilled, even when I run the project. Can anyone help please?

干杯,

蒂姆

我会解释为什么不起作用以及如何解决.

I will explain why is is not working and how to solve.

1.- 仅当用户控件在可视化树中具有依赖属性时才会调用依赖属性.

1.- A Dependency Property is only called when the usercontrol has that dependency property in the visual tree.

如果你想这样做,你需要添加例如:

In case you want to do in that way, you need to add for instance :

new PropertyMetadata(string.Empty, ValueChanged));

然后更改值:

public static readonly DependencyProperty FillColourProperty = DependencyProperty.Register
        ("FillColour", typeof(string), typeof(RectangleFillTest), new PropertyMetadata(string.Empty, ValueChanged));

    private static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var control = d as RectangleFillTest;
        var fillBrush = new SolidColorBrush();
        if (control.FillColour == "red")
            fillBrush = new SolidColorBrush(Colors.Red);
        else
            fillBrush = new SolidColorBrush(Colors.Green);
        control.rect.Fill = fillBrush;
    }

    public string FillColour
    {
        get
        {
            return (string)GetValue(FillColourProperty);
        }

        set
        {
            SetValue(FillColourProperty, value);

        }
    }

这对您的逻辑来说是明确的,如果您需要使用将属性绑定到矩形的任何颜色等更通用的代码,请告诉我.

That is explicit for your logic, in case you need a more generic code for any color, etc using binding the property to the rectangle, just tell me.