How to enumerate all dependency properties of control?

前端 未结 5 1771
名媛妹妹
名媛妹妹 2020-12-01 21:17

I have some WPF control. For example, TextBox. How to enumerate all dependency properties of that control (like XAML editor does)?

相关标签:
5条回答
  • 2020-12-01 21:58
    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;
    }
    

    Found here: http://social.msdn.microsoft.com/Forums/en/wpf/thread/580234cb-e870-4af1-9a91-3e3ba118c89c

    0 讨论(0)
  • 2020-12-01 21:58

    You can use reflection, via the GetFields, method to find all the public static properties on TextBox. You can then use a Linq Where clause to filter these to any of type DependencyProperty:

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

    You can then transform this to a list of names via a Select:

      var dependencyProperties = typeof(TextBox).GetFields(flags)
                         .Where(f => f.FieldType == typeof(DependencyProperty))
                         .Select(dp => dp.Name);
    

    Note: each name has a 'Property' suffix, you can of course remove this in the above Select clause if you like.

    0 讨论(0)
  • 2020-12-01 22:06

    If you want name of the DependencyProperties of an element then you can do this:

        var results = from prop in typeof(element).GetFields() 
                      where prop.FieldType == typeof(DependencyProperty)
                      select prop.Name.Substring(0, prop.Name.Length - 8);
    

    where 8 is length of the string "Property" which appears at the end of a dependency property!

    0 讨论(0)
  • 2020-12-01 22:09

    Using reflection is not needed (and a bad idead IMHO) because the framework has already utility classes for this (but they're not obvious to find :-).

    Here is an answer based on this article: Enumerate Bindings and the LocalValueEnumerator Structure

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

    Here is another answer based on this other article: Getting list of all dependency/attached properties of an Object that uses MarkupWriter.GetMarkupObjectFor Method.

        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;
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-01 22:09

    Try

            var fieldInfos = typeof(TextBox).GetFields( BindingFlags.Public | BindingFlags.Static).Where(x=>x.FieldType == typeof(DependencyProperty));
            foreach (var fieldInfo in fieldInfos)
            {
                Console.WriteLine(fieldInfo.Name);
            }
    
    0 讨论(0)
提交回复
热议问题