问题描述
我正在尝试从 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.
这篇关于如何从 XAML 设置 WPF 用户控件属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!