3

特定の無関係な要素に設定する必要があるカスタム添付プロパティを作成しました。この添付プロパティの目的は、これらすべての要素の幅を同じに保つことです。したがって、これらの要素のいずれかが幅を変更すると、この添付プロパティ セットで他のすべての要素を更新する必要があります。UIPropertyMetadata を介して設定された「DP プロパティ変更イベント ハンドラー」を介して、添付プロパティへの変更を追跡できるため、要素の幅が変更されたときにその通知を受け取ることができます。次に、この this 添付プロパティ セットを持つ他のすべての要素を更新する必要があります。

だから私はこれを行うことは可能ですか?特定の添付プロパティ セットを持つすべての DependencyObject インスタンスを列挙する方法はありますか?

これは少し高度な WPF のものだと思いますが、私の WPF アプリケーションでは非常に具体的な要件です。

4

1 に答える 1

3

ビジュアルツリーを列挙して、各要素にプロパティが設定されているかどうかを確認できます。このようなもの:

var objectsWithPropertySet = new List<DependencyObject>();
if (RootVisual.ReadLocalValue(FocusIdProperty) != DependencyProperty.UnsetValue)
    objectsWithPropertySet.Add(RootVisual);

objectsWithPropertySet.AddRange(RootVisual.GetAllChildren()
    .Where(o => o.ReadLocalValue(FocusIdProperty) != DependencyProperty.UnsetValue));

GetAllChildren()拡張メソッドは次のように実装されます。

public static class VisualTreeHelperExtensions
{
    public static IEnumerable<DependencyObject> GetAllChildren(this DependencyObject parent)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            // retrieve child at specified index
            var directChild = (Visual)VisualTreeHelper.GetChild(parent, i);

            // return found child
            yield return directChild;

            // return all children of the found child
            foreach (var nestedChild in directChild.GetAllChildren())
                yield return nestedChild;
        }
    }
}
于 2012-12-11T10:46:38.063 に答える