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

Создание ссылок на файлы в Visual Studio

Чтобы добавить ссылку на файл в WPF или Silverlight проект в Visual Studio достаточно в меню «Project» вызвать пункт «Add Existing Item…», перейти в папку другого проекта (Silverlight или WPF), выбрать файл и нажать «Add As Link» в меню кнопки «Add».

Рисунок 10.1. Меню добавления нового элемента в проект.

Рисунок 10.2. Выпадающая кнопка для добавления ссылки на файл

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

При использовании ссылок на 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 в каждом проекте.

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