Читайте также:
|
|
К сожалению, в случае XAML не существует встроенной поддержки директив препроцессора или схожего приема разделения отличных блоков кода. Конечно, существуют некоторые сторонние решения, однако хоть это и выглядит прогрессивно с точки зрения энтузиаста, кроме случаев действительно больших XAML файлов, сложных в поддержке, обычно более разумно работать с 2 файлами, если различия в разметке не удается обойти. Таким образом, следует либо составлять такую XAML разметку, которая будет корректна как в Silverlight, так и в WPF, и создать ссылку на этот файл в одном из проектов, либо поддерживать 2 параллельные версии файла.
Решение проблем недостающего функционала
Отсутствие FrameworkPropertyMetadata
Как известно, в Silverlight отсутствует класс FrameworkPropertyMetadata. Одна из наиболее часто используемых возможностей этого FrameworkPropertyMetadata по сравнению с имеющемся в Silverlight PropertyMetadata – это логические переключатели, которые управляют влиянием свойства на различные аспекты прорисовки объекта, такие как AffectsMeasure, AffectsArrange, и другие. Если один из флагов установлен в истинное значение, соответствующий аспект объявляется недействительным.
К счастью, данное поведение достаточно легко эмулировать при помощи PropertyMetadata и PropertyChangedCallback. Так, если в случае разработки только для WPF можно написать:
1: public static readonly DependencyProperty SomethingProperty 2: = DependencyProperty.Register(3: "Something", typeof(string), typeof(Window1), 4: new FrameworkPropertyMetadata(string.Empty, 5: FrameworkPropertyMetadataOptions.AffectsMeasure) 6:);То универсальный WPF/Silverlight код, достигающий такого же эффекта, будет выглядеть следующим образом:
1: public static readonly DependencyProperty SomethingProperty 2: = DependencyProperty.Register(3: "Something", typeof(string), typeof(Window1), 4: new PropertyMetadata(string.Empty, 5: new PropertyChangedCallback(6: Window1.SomethingProperty_Changed))); 7: 8: private static void SomethingProperty_Changed(9: DependencyObject d, DependencyPropertyChangedEventArgs e) 10: { 11: ((FrameworkElement)d).InvalidateMeasure(); 12: }Чтобы не допустить копирования кода имеет смысл создать вспомогательный класс, методы которого устанавливают недействительными различные аспекты и их комбинации, и использовать эти методы в обработчиках изменений зависимых свойств, если нет необходимости добавлять в них дополнительную логику.
Дата добавления: 2015-08-13; просмотров: 112 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создание ссылок на XAML файлы | | | Отсутствие метода OverrideMetadata() |