如何枚举控件的所有依赖属性?

Den*_*nis 11 wpf dependency-properties

我有一些WPF控件.例如,TextBox.如何枚举该控件的所有依赖属性(如XAML编辑器那样)?

Sim*_*ier 10

不需要使用反射(以及一个错误的idead恕我直言),因为框架已经有了实用程序类(但是它们并不明显可以找到:-).

以下是基于本文的答案:枚举绑定LocalValueEnumerator结构

    public static IEnumerable<DependencyProperty> EnumerateDependencyProperties(this DependencyObject obj)
    {
        if (obj != null)
        {
            LocalValueEnumerator lve = obj.GetLocalValueEnumerator();
            while (lve.MoveNext())
            {
                yield return lve.Current.Property;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是基于另一篇文章的另一个答案:获取使用MarkupWriter.GetMarkupObjectFor方法的Object的所有依赖项/附加属性的列表.

    public static IEnumerable<DependencyProperty> EnumerateDependencyProperties(object element)
    {
        if (element != null)
        {
            MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element);
            if (markupObject != null)
            {
                foreach (MarkupProperty mp in markupObject.Properties)
                {
                    if (mp.DependencyProperty != null)
                        yield return mp.DependencyProperty;
                }
            }
        }
    }

    public static IEnumerable<DependencyProperty> EnumerateAttachedProperties(object element)
    {
        if (element != null)
        {
            MarkupObject markupObject = MarkupWriter.GetMarkupObjectFor(element);
            if (markupObject != null)
            {
                foreach (MarkupProperty mp in markupObject.Properties)
                {
                    if (mp.IsAttached)
                        yield return mp.DependencyProperty;
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Pav*_*kov 9

public IList<DependencyProperty> GetAttachedProperties(DependencyObject obj)
{
    List<DependencyProperty> result = new List<DependencyProperty>();

    foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj,
        new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.All) }))
    {
        DependencyPropertyDescriptor dpd =
            DependencyPropertyDescriptor.FromProperty(pd);

        if (dpd != null)
        {
            result.Add(dpd.DependencyProperty);
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

这里找到:http://social.msdn.microsoft.com/Forums/en/wpf/thread/580234cb-e870-4af1-9a91-3e3ba118c89c


Col*_*inE 5

您可以通过GetFields方法使用反射来查找TextBox上的所有公共静态属性.然后,您可以使用Linq Where子句将这些子句过滤为任何类型的DependencyProperty:

  var flags = BindingFlags.Static |
              BindingFlags.FlattenHierarchy |
              BindingFlags.Public;
  var dependencyProperties = typeof(TextBox).GetFields(flags)
                     .Where(f => f.FieldType == typeof(DependencyProperty));
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过选择将其转换为名称列表:

  var dependencyProperties = typeof(TextBox).GetFields(flags)
                     .Where(f => f.FieldType == typeof(DependencyProperty))
                     .Select(dp => dp.Name);
Run Code Online (Sandbox Code Playgroud)

注意:每个名称都有一个'Property'后缀,如果您愿意,您当然可以在上面的Select子句中删除它.