Tôi có một số điều khiển WPF. Ví dụ, TextBox. Làm thế nào để liệt kê tất cả các thuộc tính phụ thuộc của điều khiển đó (như trình soạn thảo XAML)?Làm thế nào để liệt kê tất cả các thuộc tính phụ thuộc của kiểm soát?
Trả lời
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;
}
Tìm thấy ở đây: http://social.msdn.microsoft.com/Forums/en/wpf/thread/580234cb-e870-4af1-9a91-3e3ba118c89c
Bạn có thể sử dụng phản chiếu, qua getFields, phương pháp để tìm tất cả các thuộc tính public static trên TextBox. Sau đó bạn có thể sử dụng một LINQ mệnh đề WHERE để lọc những đối với bất kỳ loại thuộc tính phụ thuộc:
var flags = BindingFlags.Static |
BindingFlags.FlattenHierarchy |
BindingFlags.Public;
var dependencyProperties = typeof(TextBox).GetFields(flags)
.Where(f => f.FieldType == typeof(DependencyProperty));
Sau đó bạn có thể chuyển đổi này vào một danh sách các tên thông qua một Select:
var dependencyProperties = typeof(TextBox).GetFields(flags)
.Where(f => f.FieldType == typeof(DependencyProperty))
.Select(dp => dp.Name);
Lưu ý: mỗi tên có hậu tố 'Thuộc tính', bạn có thể loại bỏ điều này trong mệnh đề Chọn ở trên nếu bạn muốn.
+1 cho 'BindingFlags.FlattenHierarchy'. Tôi không có nó. – Aliostad
Giải pháp này không tốt. Xem chủ đề này tại MSDN: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/d47114a7-b182-485c-b1dd-1078ddd42be9/. Xem nhận xét của Dr.WPF. – Dennis
Về các bình luận của Dr.WPF, (1) Chắc chắn, sự phản chiếu chậm, nhưng đó là cách duy nhất để làm điều này, nếu tốc độ là một vấn đề, hãy lưu lại kết quả. (2) Phương pháp trên không phụ thuộc vào sự hiện diện của CLR accessors, vì vậy đây không phải là vấn đề, (3) Phương pháp này cũng sẽ tìm các thuộc tính đính kèm. – ColinE
Nếu bạn muốn tên của DependencyProperties của một phần tử thì bạn có thể làm điều này:
var results = from prop in typeof(element).GetFields()
where prop.FieldType == typeof(DependencyProperty)
select prop.Name.Substring(0, prop.Name.Length - 8);
nơi 8 là chiều dài của chuỗi "tài sản" xuất hiện ở phần cuối của một tài sản phụ thuộc!
Hãy thử
var fieldInfos = typeof(TextBox).GetFields(BindingFlags.Public | BindingFlags.Static).Where(x=>x.FieldType == typeof(DependencyProperty));
foreach (var fieldInfo in fieldInfos)
{
Console.WriteLine(fieldInfo.Name);
}
dùng phản ánh là không cần thiết (và một idead IMHO xấu) vì khuôn khổ có đã lớp tiện ích cho việc này (nhưng chúng không rõ ràng để tìm :-).
Dưới đây là một câu trả lời dựa trên bài viết này: Enumerate Bindings và 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;
}
}
}
Dưới đây là một câu trả lời dựa trên bài viết này khác: Getting list of all dependency/attached properties of an Object sử dụng 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;
}
}
}
}
- 1. Cách liệt kê tất cả các thuộc tính của lớp
- 2. Groovy Liệt kê tất cả các thuộc tính cho lớp
- 3. Làm thế nào để lập trình liệt kê tất cả các thuộc tính được xác định?
- 4. Chức năng của PHP để liệt kê tất cả các thuộc tính của đối tượng
- 5. Liệt kê tất cả các thuộc tính của đối tượng cửa sổ?
- 6. Làm thế nào để liệt kê các thuộc tính của bean
- 7. Làm thế nào để liệt kê các phụ thuộc của một JAR
- 8. Làm thế nào để đệ quy liệt kê thông qua các thuộc tính của đối tượng?
- 9. Làm thế nào tôi có thể liệt kê tất cả các thuộc tính của đối tượng Math?
- 10. Làm cách nào để liệt kê tất cả các thuộc tính của một đối tượng trong pdb python?
- 11. Làm cách nào để liệt kê tất cả các thuộc tính trong đối tượng và nhận giá trị của chúng?
- 12. Làm thế nào để viết một liệt kê của tất cả các chức năng tính toán?
- 13. Làm thế nào để liệt kê các thuộc tính của đối tượng bằng Python?
- 14. Có cách nào để liệt kê tất cả các hiệp hội thuộc về không?
- 15. Có thể liệt kê tất cả các lớp PHP và các phương thức và thuộc tính của chúng?
- 16. Liệt kê tất cả virtualenv
- 17. Psql liệt kê tất cả các bảng
- 18. Bao gồm tất cả các phụ thuộc
- 19. Tìm hiểu phụ thuộc của tất cả các tệp DLL?
- 20. Làm thế nào để liệt kê tất cả các mục của tệp tar trong java?
- 21. Làm thế nào để bạn liệt kê tất cả các tiến trình con trong python?
- 22. Lặp lại các thuộc tính không liệt kê
- 23. Làm thế nào để lặp qua tất cả các thuộc tính của một lớp?
- 24. Tôi làm cách nào để liệt kê tất cả các tiến trình đang chạy trong Windows?
- 25. làm thế nào để liệt kê tất cả các thư mục con trong một thư mục
- 26. Liệt kê tất cả các chỉ mục
- 27. Liệt kê tất cả các gói con của gói
- 28. windows .bat tập tin cách đệ quy liệt kê tất cả các tệp thuộc loại * .mp3
- 29. Liệt kê tất cả các kho SVN
- 30. Gradle, Làm thế nào để vô hiệu hóa tất cả các phụ thuộc Transitive
Xin cảm ơn, Pavlo. Nó hoạt động. – Dennis