3

私のコントロールには 5 つの依存関係プロパティがあります。次のように XAML で設定します。

<MyControl Prop1="1" Prop2="2" Prop3="3" Prop4="4" />

ご覧のとおり、XAML の 5 つのプロパティのうち 4 つだけを設定しています。

XAML で設定されたすべてのプロパティが処理されたことを示す何らかのメカニズムを見つける必要があります。このイベントで、SetItAllUp() メソッドを実行できます。

オプション 1。DPセッターを使う

FAIL: SetItAllUp() を 1 回呼び出すことができないため、オプションではありません。これには、XAML の各 DP の序数宣言に基づいてアクティブ化するという副作用もあります。プロパティ間に何らかの種類の連鎖または依存関係がある場合、これはそれを弱体化させます。

オプション 2。DP セッターを使用して、すべての値が設定されていることをテストします

不合格: オプションではありません。特定の DP 値がオプションである場合があるためです。オプションの値が適切に設定されているかどうかを判断するために必要なロジックが複雑すぎて、現時点ではこのソリューションを実装できないというふりをしましょう。

オプション 3。MyControl.Loaded を使用する

FAIL: これは起動が早すぎるため、オプションではありません。実際、私が見ることができるすべてのイベントは、開始が早すぎます。オブジェクトが作成され、内部で何かが宣言に基づいて DP 値の設定を開始するようなものです。


アップデート!ロードは解決策です。私の質問に欠陥がありました。

何かイベントとかあるよね?// ありがとう

4

1 に答える 1

2

ロードされたものは正常に動作します。混乱させて申し訳ありません。

私はこのクラスをテストしました:

public class MyPath : Path
{
    public MyPath()
    {
        Loaded += MyPath_Loaded;
    }

    void MyPath_Loaded(object sender, RoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Loaded");
    }
    public int Test1
    {
        get { return (int)GetValue(Test1Property); }
        set
        {
            SetValue(Test1Property, value);
            System.Diagnostics.Debug.WriteLine("Test1");
        }
    }
    public static readonly DependencyProperty Test1Property =
        DependencyProperty.Register("Test1", typeof(int), typeof(MyPath),
        new PropertyMetadata(DependencyProperty.UnsetValue, null));

    public int Test2
    {
        get { return (int)GetValue(Test2Property); }
        set
        {
            SetValue(Test2Property, value);
            System.Diagnostics.Debug.WriteLine("Test2");
        }
    }
    public static readonly DependencyProperty Test2Property =
        DependencyProperty.Register("Test2", typeof(int), typeof(MyPath),
        new PropertyMetadata(DependencyProperty.UnsetValue, null));

    public int Test3
    {
        get { return (int)GetValue(Test3Property); }
        set
        {
            SetValue(Test3Property, value);
            System.Diagnostics.Debug.WriteLine("Test3");
        }
    }
    public static readonly DependencyProperty Test3Property =
        DependencyProperty.Register("Test3", typeof(int), typeof(MyPath),
        new PropertyMetadata(DependencyProperty.UnsetValue, null));

    public int Test4
    {
        get { return (int)GetValue(Test4Property); }
        set
        {
            SetValue(Test4Property, value);
            System.Diagnostics.Debug.WriteLine("Test4");
        }
    }
    public static readonly DependencyProperty Test4Property =
        DependencyProperty.Register("Test4", typeof(int), typeof(MyPath),
        new PropertyMetadata(DependencyProperty.UnsetValue, null));

    public int Test5
    {
        get { return (int)GetValue(Test5Property); }
        set
        {
            SetValue(Test5Property, value);
            System.Diagnostics.Debug.WriteLine("Test5");
        }
    }
    public static readonly DependencyProperty Test5Property =
        DependencyProperty.Register("Test5", typeof(int), typeof(MyPath),
        new PropertyMetadata(DependencyProperty.UnsetValue, null));
}

この XAML では:

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <local:MyPath Test1="1" Test2="2" Test3="3" Test4="4" />
</Grid>

そして、このトレースを取得しました:

Test1
Test2
Test3
Test4
Loaded

そして、Loaded が問題なく動作することがわかりました。私の以前のテストには、他の要因があったに違いありません。私の簡単なテストでは、Loaded が完璧に見えることを示しています。

于 2012-06-01T00:43:48.357 に答える