(lookless コントロールではなく) カスタム UserControl を作成しており、コンシューマーが XAML でコントロールに設定したプロパティに基づいて初期化を実行する必要があります。
現在、ほとんどの場合、Initialized イベント (または OnInitialized オーバーライド) を使用します。これは、発生するまでにすべての XAML 設定プロパティが適用されているためですが、UserControl の場合はそうではありません。Initialized イベントが発生すると、すべてのプロパティはデフォルト値のままです。
コンストラクターで InitializeComponent() を呼び出すという点で異なる UserControls だけで、他のコントロールではこれに気付かなかったので、テストとして、その行をコメントアウトしてコードを実行し、今回は Initializedイベント、プロパティが設定されました。
これを示すコードとテスト結果を次に示します...
コンストラクターで呼び出された 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 でユーザーが設定したプロパティに基づいてコントロールを初期化するには、何を使用すればよいでしょうか? (注: コントロールはそれまでに初期化されているはずなので、Loaded では遅すぎます。)
XAML スニペット
<local:TestControl TestValue="New Value!" />
TestControl.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);
}
}