Возможно ли узнать, какие установщики доступны в стиле в wpf?

#c# #wpf

#c# #wpf

Вопрос:

Я загрузил сборку, в которой есть класс. Класс предоставляет свойство style, позволяющее настраивать внешний вид. Возможно ли узнать, каковы все возможные свойства установщика, которые он позволит создать объект style? (например., посмотрев на disaassmbly и т.д.)

РЕДАКТИРОВАТЬ : если это невозможно, я также ищу рекомендации (например, найти все свойства dependencyproperty, предоставляемые классом, посмотреть MSIL-код PutStyle и т.д.)

Комментарии:

1. Ммм … вы пробовали документацию для указанного класса?

2. Не могли бы вы просто использовать отражение, чтобы получить все (публично объявленные) свойства зависимости для класса?

Ответ №1:

Я не знал точно, какова была ваша ситуация, когда я прочитал ваш вопрос. После повторного просмотра кажется, что вы пытаетесь найти, какие свойства могут быть установлены в ваших стилях для объекта. Это означало бы, что вас будут интересовать свойства зависимости, доступные только для чтения, которые доступны в объекте зависимости. Конечно, есть оговорка, что объект не обязательно может использовать все свойства для рендеринга самого себя. Поэтому не удивляйтесь, если вы задали некоторые свойства, и, похоже, ничего не изменилось.

Просто используйте отражение для поиска по всем DependencyProperty полям и получения значений (если объекты соответствуют соглашениям об объявлении свойств зависимостей). Вы могли бы использовать это для получения таких свойств.

 public static IEnumerable<DependencyProperty> GetDependencyProperties(DependencyObject owner)
{
    var type = owner.GetType();
    var flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy;
    return type.GetFields(flags)
               .Where(fi => fi.FieldType == typeof(DependencyProperty))
               .Select(fi => fi.GetValue(null))
               .Cast<DependencyProperty>();
}

// get the non-readonly dependency properties
var writableDPs = GetDependencyProperties(myObject)
    .Where(dp => !dp.ReadOnly);
  

Ответ №2:

Предложение Джеффа Меркадо звучит довольно хорошо, например, я только что использовал это в пользовательском элементе управления:

 var props = typeof(PanAndZoomControl).GetProperties()
    .Where(x => x.CanWrite)
    .Select(x => x.Name);
MessageBox.Show(String.Join(", ", props));
  

Скриншот

Я использовал разделитель-запятую, чтобы сделать его более компактным, вы могли бы просто вывести это в текстовый файл, используя File.WriteAllLines() или что-то в этом роде.

Комментарии:

1. На самом деле, я имел в виду получение всех DependencyProperties DependencyObject свойств, а не только обычных ванильных .NET.

2. Вы правы, получение только DependencyProperties намного более чистое, я думаю, что в большинстве случаев они вернут те же результаты, хотя, поскольку в элементах управления вы обычно используете только DPS.