我们正在编写一个自定义的 UserControl(与无外观的控件相反),我们需要根据我们的消费者在 XAML 中为我们的控件设置的属性执行一些初始化。
现在,在大多数情况下,您将使用 Initialized 事件(或 OnInitialized 覆盖),因为在触发时,所有 XAML 设置的属性都已应用,但对于 UserControl,情况并非如此。当 Initialized 事件触发时,所有属性仍为其默认值。
对于其他控件,我没有注意到这一点,只是 UserControls,它们的不同之处在于它们在构造函数中调用 InitializeComponent(),因此作为测试,我注释掉了该行并运行了代码,果然,这次是在初始化期间事件,属性被设置。
这里有一些代码和测试结果证明了这一点......
在构造函数中调用 InitializeComponent 的结果:(
注意:尚未设置值)
TestValue (Pre-OnInitialized): Original Value
TestValue (Initialized Event): Original Value
TestValue (Post-OnInitialized): Original Value
InitializeComponent 完全注释掉的结果:(
注意:虽然值已设置,但控件未加载,因为它需要 InitializeComponent)
TestValue (Pre-OnInitialized): New Value!
TestValue (Initialized Event): New Value!
TestValue (Post-OnInitialized): New Value! // Event *was* called and the property has been changed
综上所述,我可以使用什么来根据 XAML 中的用户设置属性来初始化我的控件?(注意:加载为时已晚,因为此时控件应该已经初始化。)
XAML 代码段
<local:TestControl TestValue="New Value!" />
测试控制.cs
public partial class TestControl : UserControl {
public TestControl() {
this.Initialized += TestControl_Initialized;
InitializeComponent();
}
protected override void OnInitialized(EventArgs e) {
Console.WriteLine("TestValue (Pre-OnInitialized): " + TestValue);
base.OnInitialized(e);
Console.WriteLine("TestValue (Post-OnInitialized): " + TestValue);
}
void TestControl_Initialized(object sender, EventArgs e) {
Console.WriteLine("TestValue (Initialized Event): " + TestValue);
}
public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register(
nameof(TestValue),
typeof(string),
typeof(TestControl),
new UIPropertyMetadata("Original Value"));
public string TestValue {
get => (string)GetValue(TestValueProperty);
set => SetValue(TestValueProperty, value);
}
}