Читайте также:
|
|
WPF позволяет переопределять метаданные зависимых свойств при помощи метода OverrideMetadata объекта DependencyProperty. В следующем коде переопределяется ширина по умолчанию у элемента управления, наследованного от класса Control:
1: static MyControl() 2: { 3: FrameworkPropertyMetadata newMetadata 4: = new FrameworkPropertyMetadata(); 5: newMetadata.DefaultValue = 180.0; 6: Control.WidthProperty.OverrideMetadata(typeof(MyControl), 7: newMetadata); 8: }Так как в Silverlight такой метод отсутствует, при необходимости изменить значение по умолчанию какого-либо свойства, необходимо просто установить это значение в конструкторе:
1: public MyControl() 2: { 3: this.Width = 180; 4: }Другая возможность метода OverrideMetadata() – это задание обработчика изменения зависимого свойства базового класса:
1: static MyControl() 2: { 3: #if!SILVERLIGHT 4: FrameworkPropertyMetadata newMetadata 5: = new FrameworkPropertyMetadata(); 6: newMetadata.PropertyChangedCallback 7: += MyControl.VisibilityProperty_Changed; 8: Control.VisibilityProperty.OverrideMetadata(9: typeof(MyControl), newMetadata); 10: #endif 11: }После этого в методе VisibilityProperty_Changed можно обрабатывать все изменения зависимого свойства Visibility.
1: private static void VisibilityProperty_Changed(2: DependencyObject d, DependencyPropertyChangedEventArgs e) 3: { 4: // do something here 5: }К сожалению, т.к. данного метода в Silverlight нет совсем, изящного решения данной проблемы не существует. Однако можно воспользоваться не очень чистым приемом, включающим определение дополнительного зависимого свойства и привязку исходного свойства к нему. Аналог приведенного выше примера для Silverlight приложения в таком случае будет выглядеть следующим образом:
1: #if SILVERLIGHT 2: // объявление дополнительного зависимого свойства, которое 3: // использует такой же PropertyChangedCallback, что и WPF код 4: private static readonly DependencyProperty 5: VisibilityChangedWorkaroundProperty 6: = DependencyProperty.Register(7: "VisibilityChangedWorkaround", typeof(Visibility), 8: typeof(MyControl), 9: new PropertyMetadata(MyControl.VisibilityProperty_Changed)); 10: #endif 11: 12: public MyControl() 13: { 14: #if SILVERLIGHT 15: // привязка дополнительного зависимого свойства 16: Binding visibilityBnd = new Binding("Visibility"); 17: visibilityBnd.Source = this; 18: visibilityBnd.Mode = BindingMode.TwoWay; 19: this.SetBinding(20: MyControl.VisibilityChangedWorkaroundProperty, 21: visibilityBnd); 22: #endif 23: }Как видно из примера, определено дополнительное зависимое свойство VisibilityChangedWorkaroundProperty, и в качестве её обработчика изменения указан тот же метод, что и в WPF коде, приведенном выше. Нет необходимости создавать CLR свойство-обертку для дополнительного свойства, и само дополнительное зависимое свойство определено как приватное, так что оно доступно только внутри класса и невидимо для внешних компонент.
Затем в конструкторе дополнительное свойство привязывается к свойству Visibility базового класса. Таким образом, когда свойство базового класса изменится, дополнительное свойство также будет изменено в результате срабатывания привязки, после чего будет вызван обработчик VisibilityProperty_Changed.
Дата добавления: 2015-08-13; просмотров: 103 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Синхронное использование XAML | | | Отсутствие свойства No PathSegment.IsStroked |