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)
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
您可以通过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子句中删除它.
| 归档时间: |
|
| 查看次数: |
6028 次 |
| 最近记录: |