Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
course_(Windows&Web).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.68 Mб
Скачать

Отсутствие приведения значения

WPF имеет достаточно мощный механизм приведения значений зависимых свойств. К сожалению, такого функционала в Silverlight нет. Приведение значений возможно производить при помощи сочетания PropertyChangedCallback и обычных методов класса. В некоторых сложных, но не слишком критичных сценариях возможно имеет смысл использовать приведение значения в WPF версии и не проверять его совсем в Silverlight версии.

Отсутствие метода OverrideMetadata()

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]