Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Создание ссылок на XAML файлы

Читайте также:
  1. I СОЗДАНИЕ ОРГАНИЗАЦИОННОЙ ДИАГРАММЫ
  2. I Создание рисунка в технике акварель
  3. II СОЗДАНИЕ ДИАГРАММ ДРУГИХ ТИПОВ
  4. II Создание пользовательской кисти
  5. III Технология использования градиента. Создание пользовательского градиента
  6. IV. Создание образа убийцы
  7. Thorn;Создание графического элемента SmartArt

При использовании ссылок на C# или VB файлы компилятор обрабатывает их так же как и при использовании обычных копий файлов. В случае с XAML возникают некоторые проблемы, которые возможно обойти, добавив немного лишнего кода.

Предположим, что существует WPF проект, в котором определен пользовательский элемент управления MyTemplatedControl. Он не содержит никакой логики, всего лишь устанавливает стиль по умолчанию при помощи свойства DefaultStyleKey:

1: public class MyTemplatedControl: Control 2: { 3: public MyTemplatedControl() 4: { 5: this.DefaultStyleKey = typeof(MyTemplatedControl); 6: } 7: }

В файле Generic.xaml, находящемся в папке Themes данного проекта, в стиле по умолчанию объявлен шаблон для данного элемента управления:

Рисунок 10.3. Пользовательский элемент управления и файл с его стилем по умолчанию.

В соответствии с этим шаблонов элемент управления MyTemplatedControl должен отображать синий прямоугольник – так можно легко проверить, что шаблон успешно найден и применен:

1: <ResourceDictionary 2:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4: xmlns:local="clr-namespace:TestControl" 5: > 6: 7: <Style TargetType="local:MyTemplatedControl"> 8: <Setter Property="Template"> 9: <Setter.Value> 10: <ControlTemplate 11: TargetType="local:MyTemplatedControl"> 12: <Canvas> 13: <Rectangle Canvas.Left="20" 14: Canvas.Top="20" Width="100" 15: Height="100" Fill="Blue" 16: Stroke="Black" StrokeThickness="3" /> 17: </Canvas> 18: </ControlTemplate> 19: </Setter.Value> 20: </Setter> 21: </Style> 22: </ResourceDictionary>

Этот элемент управления добавлен на тестовое окно. Если запустить приложение, то окно будет выглядеть следующим образом:

Рисунок 10.4. Тестовое окно.

Предположим, что теперь необходимо создать Silverlight версию данного элемента управления. Для этого создается проект Silverlight, при помощи пункта «Add Existing Item…» и кнопки «Add As Link» добавляются ссылки на файл MyTemplatedControl.cs в корне проекта и файл Generic.xaml в папке Themed. Такой проект удачно скомпилируется, однако если добавить этот элемент управления в Silverlight приложение, на его месте будет показана пустая белая область – очевидно, что шаблон по умолчанию не был применен.

Это происходит так, потому что по какой-то причине (возможно, для этого есть веские основания, или это просто ошибка) XAML компилятор обрабатывает локальные и добавленные по ссылке.xaml файлы по-разному. Если коротко, то для последнего задается упрощенный ресурсный ключ, а значит при поиске стиля по умолчанию файл, добавленный по ссылке, игнорируется средой выполнения, так как он имеет неверный с её точки зрения ресурсный ключ.

Решение данной проблемы – использование объединения словарей при помощи MergedDictionaries: необходимо переместить содержимое файла Generic.xaml в отдельный XAML файл (лучше, если будет создано по отдельному файлу для каждого элемента управления), и включить их при помощи MergedDictionaries в файл Generic.xaml.

MyTemplatedControl.xaml:

1: <ResourceDictionary 2: xmlns= 3: "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5: xmlns:local="clr-namespace:TestControl" 6: > 7: <Style TargetType="local:MyTemplatedControl"> 8: <Setter Property="Template"> 9: <Setter.Value> 10: <ControlTemplate 11: TargetType="local:MyTemplatedControl"> 12: <Canvas> 13: <Rectangle Canvas.Left="20" 14: Canvas.Top="20" Width="100" Height="100" 15: Fill="Blue" Stroke="Black" StrokeThickness="3" /> 16: </Canvas> 17: </ControlTemplate> 18: </Setter.Value> 19: </Setter> 20: </Style> 21: </ResourceDictionary>

Generic.xaml:

1: <ResourceDictionary 2: xmlns= 3: "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5: > 6: <ResourceDictionary.MergedDictionaries> 7: <ResourceDictionary 8: Source="/WpfControl;component/Themes/MyTemplatedControl.xaml" /> 9: </ResourceDictionary.MergedDictionaries> 10: </ResourceDictionary>

Затем необходимо добавить файл MyTemplatedControl.xaml в Silverlight проект в качестве ссылки, а файл Generic.xaml – в виде копии, в которую дополнительно вносятся изменения.

Generic.xaml (версия для Silverlight)

1: <ResourceDictionary 2:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4: > 5: <ResourceDictionary.MergedDictionaries> 6: <ResourceDictionary 7: Source="/SlControl;component/MyTemplatedControl.xaml" /> 8: </ResourceDictionary.MergedDictionaries> 9: </ResourceDictionary>

Обратите внимание на отличия в файле Generic.xaml для Silverlight:

· Он ссылается на файлы в Silverlight сборке (SlControl);

· Он ссылается на добавленные по ссылке файлы по их «некорректному» ресурсному ключу (обратите внимание на отсутствие ‘Themes’ в пути).

Теперь Silverlight приложение работает правильно:

Рисунок 10.5. Корректно работающее тестовое Silverlight приложение.

Таким образом возможно использовать общую XAML разметку в Silverlight и WPF приложениях без необходимости поддерживать 2 различные версии файла. Единственное, что для этого необходимо сделать – создать и поддерживать различные Generic.xaml в каждом проекте.


Дата добавления: 2015-08-13; просмотров: 154 | Нарушение авторских прав


Читайте в этой же книге: Шаг 2. Использование нестандартных команд. | Класс представления (View). | Класс модели представления (View Model). | Реализация INotifyCollectionChanged. | Создание представления, определенного как шаблон данных. | Краткие итоги | В паттерне MVVM инкапсулирует логику представления и данные для отображения (англ. яз.). | Интерфейс, предоставляющий базовую поддержку валидации данных и сообщения об ошибках | Шаг 4. View | Шаг 4. Редактирование |
<== предыдущая страница | следующая страница ==>
Шаг 5. Команды| Синхронное использование XAML

mybiblioteka.su - 2015-2024 год. (0.008 сек.)