Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Создание DependencyProperty

#c_sharp #wpf #xaml


Есть некий UserControl, естественно являющийся DependencyObject'om для которого нужно
создать свое DependencyProperty по типу такого: 


где    HorizontalAlignment="Left" является DependencyProperty. Как это сделать наиболее
правильно. Покидайте хороших статей на эту тему, а еще лучше примеры кода. Заранее
благодарю за помощь.    


Ответы

Ответ 1



Обычное свойство зависимостей (также влияющее на собственную перерисовку в примере). В конструкторе FrameworkPropertyMetadata можно определить дополнительные настройки, такие как метод корректировки значения или обработки измененного значения. MSDN или книга "WPF 3.0-4.0 для профессионалов" #region Единичный размер (NormalSize) [Category("Group properties")] public Size NormalSize { get { return (Size)GetValue(NormalSizeProperty); } set { SetValue(NormalSizeProperty, value); } } public static readonly DependencyProperty NormalSizeProperty = DependencyProperty.Register("NormalSize", typeof(Size), typeof(GroupPanel), new FrameworkPropertyMetadata(new Size(200, 190)) { AffectsArrange = true, AffectsMeasure = true }); #endregion Есть очень полезный тип зависимых свойств - т.н. Attatched Property. Смысл такой, как например, Grid.Row или Canvas.Top. его можно "прикрепить" к любому DependencyObject и затем его использовать уже непосредственно в контроле. При инициализации требуется чуть больше кода, но он идейно обоснован и без него никак. Вот пример Attatched Property. static GroupPanel() // - статический конструктор класса { var metadata = new FrameworkPropertyMetadata(); metadata.AffectsParentArrange = true; - различные атрибуты metadata.AffectsParentMeasure = true; BreakBeforeProperty = DependencyProperty.RegisterAttached( "ColumnBreakBefore", typeof(bool), typeof(GroupPanel), metadata); } #region Свойство разрыва (BreakBefore) public static DependencyProperty BreakBeforeProperty; public static void SetColumnBreakBefore(UIElement element, Boolean value) { element.SetValue(BreakBeforeProperty, value); } public static Boolean GetColumnBreakBefore(UIElement element) { return (bool)element.GetValue(BreakBeforeProperty); } #endregion Замечание по использованию. Чтобы Attatched Property работало правильно и распознавалась системой, необходимо соблюдать соглашение по наименованию статичестих методов public static тип свойства Get(Set)имя свойства(тип объекта). Надеюсь это понятно. В моем примере это public static Boolean GetColumnBreakBefore(UIElement element) { }

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

Отправить комментарий