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

Отсутствие зависимых свойств только для чтения

Одна из действительно удобных возможностей WPF – определение зависимых свойств только для чтения. Такое свойство полезно, если необходимо отобразить какой-либо статус объекта, определяемый его внутренним состоянием (как, например, свойство IsMouseOver), и разработчик не хочет позволять внешним компонентам изменять данное значение извне. Такого эффекта можно с легкостью достичь при использовании обычных .NET свойств, но что если необходимо создать свойство только для чтения, которое будет обладать всеми возможностями зависимого свойства?

К сожалению, не существует простого решения для Silverlight. Безусловно, можно создать CLR свойство-обертку для зависимого свойства без метода доступа set, однако при этом любой компонент может установить значение свойству при помощи метода SetValue().

Таким образом, в данном случае приходится выбирать: совсем не использовать зависимые свойства только для чтения, или использовать разделение кода (при помощи директив препроцессора или разделяемых классов) между WPF и Silverlight. Следует помнить, что в данном случае придется использовать различный код не только для объявление зависимого свойства, но и в вызове SetValue (т.к. необходимо вызывать SetValue для DependencyPropertyKey в случае зависимого свойства только для чтения). Легко понять, что в таком случае исходный код будет достаточно трудночитаем из-за многочисленных ветвлений препроцессора #if SILVERLIGHT.

Отсутствие класса Brushes

Класс Brushes в WPF содержит предопределенные сплошные кисти, которые достаточно полезны при использовании кистей в коде.

1: border.Background = Brushes.White;

Данный класс отсутствует в Silverlight. При написании WPF/Silverlight совместимого кода следует использовать класс Colors, который достаточно похож на класс Brushes, только вместо предопределенных кистей содержит предопределенные цвета. Таким образом, код выше может быть переписан на:

1: border.Background = new SolidColorBrush(Colors.White);

Конечно, символов стало больше, однако это лучше, чем дублирование кода из-за настолько небольшого отличия.

При использовании именованных кистей в XAML отличий между Silverlight и WPF нет:

1: <Border Name="border" Background="White">

2: </Border>

Stroke и Pen

В WPF определен класс Pen, в то время как в Silverlight его нет. Класс Pen достаточно удобно инкапсулирует способ рисования контура фигуры в единственном объекте, который возможно повторно использовать. Так, в WPF он применяется в классе GeometryDrawing (которого, кстати, также нет в Silverlight).

Следует отметить, что во многих случаях даже в WPF его невозможно использовать – вместо него приходится применять свойства StrokeXxx. По-видимому, по этой причине в Silverlight этот класс даже не был реализован.

Конструкторы по умолчанию для геометрий

Первое, на что придется обратить внимание при работе с геометриями в Silverlight после WPF – отсутствие перегруженных конструкторов. Поэтому, если в WPF было возможно написать:

RectangleGeometry rectangle = new RectangleGeometry(new Rect(10, 10, 50, 40));

то для совместимости WPF/Silverlight данный код придется изменить на:

1: RectangleGeometry rectanble = new RectangleGeometry()

2: {

3: Rect = new Rect(10, 10, 50, 40)

4: };

что занимает не намного больше строк в файле, но зато работает как в Silverlight, так и в WPF.

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