- •«Комп’ютерні технології та програмування»
- •Оглавление
- •Лабораторная работа 1 Знакомство с wpf
- •Теоретические сведения
- •1. Знакомство с редактором xaml
- •2.Создание приложения wpf
- •Контрольные вопросы
- •Лабораторная работа 2 Подробное введение в разработку приложений wpf
- •Теоретические сведения
- •1. Ознакомление с управлением проектами wpf в msVisualStudio
- •3) Создание обработчиков событий
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •2. Создание тестового приложения wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 3 Макет программы и основные элементы управления
- •Теоретически сведения
- •1. Макет в wpf
- •2. Новые возможности wpf
- •3. Элемент управления Canvas
- •4. Элементуправления StackPanel
- •5. Элементуправления WrapPanel
- •6. Элемент управления DockPanel
- •7. Элемент Grid
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 4
- •Xaml и код, расширения разметки и ресурсы
- •Теоретически сведения
- •2. Ссылки на ресурсы в wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 6 Свойства зависимости
- •Теоретически сведения
- •1. Особенности свойств clr
- •2. Наследование значений свойств зависимости
- •3. Присоединенные свойства
- •4. Метаданныесвойствзависимости
- •5. Проверка допустимости значения
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 7 Привязка данных
- •Теоретически сведения
- •1. Концепция привязки данных
- •2. Свойство DataContext
- •3. Основные понятия привязки данных
- •4. Синтаксис привязки данных
- •5. Привязка к элементам интерфейса пользователя
- •6. Привязка к xml
- •7. Привязка к коллекции
- •8. Преобразователи значений привязки данных
- •9. Проверкапривязкиданных
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
2. Ссылки на ресурсы в wpf
Статические ресурсы. Ссылки на статические ресурсы рекомендуется использовать в следующих случаях:
При отсутствии намерений изменять значение ресурса после первой ссылки на него.
Большая часть всех ресурсов в структуре приложения сосредоточена в словарях ресурсов уровня страницы или приложения. Ссылки на статические ресурсы не обрабатываются повторно в зависимости от поведения во время выполнения, например, перезагрузки страницы. Это позволяет получить выигрыш в производительности благодаря отсутствию множества динамических ссылок на ресурсы, если в них нет необходимости.
При задании значения свойства, не являющегося объектом DependancyObject или Freezable (это постоянный объект).
При создании словаря ресурсов, который будет скомпилирован в библиотеке DLL и упакован в составе приложения либо будет совместно использоваться приложениями.
При создании темы для пользовательского элемента управления и определении ресурсов, используемых в темах. В этом случае обычно используется подстановка ссылок не на динамические, а на статические ресурсы, что делает ее прогнозируемой и самодостаточной для темы. При использовании ссылки на динамический ресурс даже ссылка в теме не обрабатывается до момента выполнения. Поэтому при применении темы некоторые локальные элементы могут переопределить ключ, на который тема пытается сослаться, и при подстановке произойдет ошибка локального элемента до самой темы. А это, в конце концов, изменит поведение темы.
При использовании ресурсов для задания множества свойств зависимости. Система свойств обеспечивает эффективное кэширование значений, поэтому, если присвоить свойству зависимости значение, которое может быть вычислено во время загрузки, свойству не потребуется проверка пересчета выражений и оно сможет возвращать последнее эффективное значение. Этот метод может неплохо повысить эффективность.
Динамические ресурсы. Ссылки на динамические ресурсы рекомендуется использовать в следующих случаях:
Если значение ресурса зависит от условий, не известных до времени выполнения. К таким ресурсам относятся системные ресурсы и ресурсы, которые иным образом задаются пользователем. Например, можно создать значения установщика, которые ссылаются на системные свойства, представляемые объектами SystemColors, SystemFonts или SystemParameters. Эти значения действительно динамические, так как они, в конечном счете, берутся из среды выполнения пользователя и операционной системы. Кроме того, могут использоваться изменяемые темы уровня приложения, при этом изменения должны отслеживаться также при доступе к ресурсу уровня страницы.
При создании или ссылке на стили темы для пользовательского элемента управления.
Если планируется корректировать содержимое словаря ResourceDictionary во время работы приложения.
Если есть сложная структура ресурсов с взаимозависимостями, где могут потребоваться опережающие ссылки. Динамические ресурсы, в отличие от статических, поддерживают опережающие ссылки, поскольку ресурс не требуется оценивать до выполнения, и опережающие ссылки, таким образом, становятся нерелевантными.
При ссылке на особенно большой с точки зрения компиляции или рабочего множества ресурс, который может не использоваться непосредственно при загрузке страницы. Ссылки на статические ресурсы всегда загружаются из XAML при загрузке страницы, ссылки на динамические ресурсы не загружаются до фактического использования.
При создании стиля, если значения установщика могут браться из других значений, на которые влияют темы или другие параметры пользователя.
Если ресурсы применяются к элементам, для которых во время работы приложения может быть изменен порядок наследования в логическом дереве. Изменение родительского элемента может изменить область поиска ресурса, так что если требуется переоценка ресурса для элемента с измененным порядком наследования с учетом новой области, следует использовать ссылку на динамический ресурс.
Варианты использования ресурсов. Далее мы рассмотрим, как определять некоторые из этих типов ресурсов. Возьмем, например, следующие типы ресурсов:
Ресурс уровня приложения (глобальный ресурс).
Ресурс уровня элемента Window.
Ресурс уровня элемента FrameworkElement.
Отдельный свободный ресурс XAML.
Ресурс уровня приложения.Чтобы создать глобальный ресурс уровня приложения, следует просто добавить раздел Resources в файл App.xaml (или как у вас называется файл приложения). Рассмотримпример.
<Application x:Class="WPF_Tour_Beginners_Part_2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<SolidColorBrush x:Key="appLevelResourceGreenBrush" Color="Green"/>
</Application.Resources>
</Application>
Это означает, что ресурсом может воспользоваться любой объект в текущем приложении. В прилагаемом демонстрационном приложении я создал один элемент Button в файле Window1.xaml, который использует ресурс уровня приложения.
<!--Объявление объекта Button, который использует ресурс уровня приложения appLevelResourceGreenBrush -->
<Button Width="auto" Content="1st Button : I use the appLevelResourceGreenBrush Application level Resource"
Background="{StaticResource appLevelResourceGreenBrush}"/>
Ресурсуровняэлемента Window
<Window x:Class="WPF_Tour_Beginners_Part_2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:SeperateWPFUserControlDll="clr-namespace:SeperateWPFUserControl_Dll;assembly=SeperateWPFUserControl_Dll"
xmlns:local="clr-namespace:WPF_Tour_Beginners_Part_2;assembly="
xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="300" Width="600"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<SolidColorBrush x:Key="windowLevelResourceBlueBrush" Color="Blue"/>
</Window.Resources>
<StackPanel x:Name="sp1" Orientation="Vertical">
<!--Объявлениедвухобъектов Button, использующихресурс Window.windowLevelResourceBlueBrush -->
<Button Width="auto" Content="1st Button : I use the resourceBrushBlue Window Resource"
Background="{StaticResource windowLevelResourceBlueBrush}"/>
<Button Width="auto" Content="2nd Button : I use the resourceBrushBlue Window Resource"
Background="{StaticResource windowLevelResourceBlueBrush}"/>
</StackPanel>
</Window>
Я просто использую ресурс windowLevelResourceBlueBrush в двух объектах Button.
Ресурс уровня элемента платформы. Как говорилось ранее, каждый такой элемент (FrameworkElement или FrameworkContentElement) обладает свойством Resources, что позволяет создать локальный (то есть доступный только текущему элементу и его дочерним элементам) ресурс.
<Window x:Class="WPF_Tour_Beginners_Part_2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:SeperateWPFUserControlDll="clr-namespace:SeperateWPFUserControl_Dll;assembly=SeperateWPFUserControl_Dll"
xmlns:local="clr-namespace:WPF_Tour_Beginners_Part_2;assembly="
xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="300" Width="600"
WindowStartupLocation="CenterScreen">
.....
<StackPanel x:Name="sp1" Orientation="Vertical">
<!--Я добавил эту строку только для того, чтобы продемонстрировать возможность добавления классов в разметку XAML. Использованные мною классы
не могут входить в интерфейс пользователя, поскольку они не являются элементами управления интерфейса (не наследуются от класса Visual).
Поэтому я поместил их в словарь ресурсов.
-->
<StackPanel.Resources>
<SolidColorBrush x:Key="parentLevelResourceOrangeBrush" Color="Orange"/>
</StackPanel.Resources>
......
......
<!--Объявлениеобъекта Button, которыйиспользуетресурсparentLevelResourceOrangeBrush родительскогоэлемента (StackPanel) -->
<Button Width="auto" Content="Button : I use the parentLevelResourceOrangeBrush parent (the StackPanel) level Resource"
Background="{StaticResource parentLevelResourceOrangeBrush}"/>
</StackPanel>
</Window>
Это означает, что использовать ресурс может элемент FrameworkElement, который объявляет ресурс, и его дочерние элементы. Попытка использовать ресурс, объявленный таким способом, приведет к созданию исключения.
Отдельные свободные ресурсы XAML. Ресурсы Windows Presentation Foundation (WPF) поддерживают функцию объединенного словаря ресурсов. Эта функция позволяет определять ресурсы приложения WPF вне скомпилированного приложения XAML. Затем такие ресурсы можно использовать в различных приложениях. Это также обеспечивает более удобную изоляцию ресурсов для локализации.
Обратите внимание, что элемент Resource Dictionary не имеет атрибута x:Key, который обычно требуется для всех элементов в коллекции ресурсов. При этом другая ссылка ResourceDictionary в коллекции Merged Dictionaries является особым случаем, зарезервированным для этого сценария объединенного словаря ресурсов. Словарь ResourceDictionary, представляющий объединенный словарь ресурсов, не может обладать атрибутом x:Key. Как правило, каждый объект Resource Dictionary в коллекции Merged Dictionaries задает атрибут Source. Значение атрибута Source должно быть в виде кода URI, который разрешает путь к объединяемому файлу ресурсов. Местом назначения этого кода URI должен быть другой файл XAML с объектом ResourceDictionary в качестве корневого элемента. Рассмотрим пример.
Определение свободного файла XAML.
<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="seperateResourceFilePinkBrush" Color="Pink"/>
</ResourceDictionary>
Далееприсвоимсвойству Build Action значение Resource или Page в Visual Studio.
Теперь можно использовать этот файл. Допустим, нужно использовать этот свободный файл XAML в свойстве Resources элемента Button. Для этого можно написать следующий код:
<!--Объявление объекта Button, который использует свободный ресурсseperateResourceFilePinkBrush уровня XAML -->
<Button Width="auto" Content="Button : Uses a seperate loose XAML level Resource, namely the seperateResourceFilePinkBrush resource">
<Button.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="SeperateResourceDictionary1.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Button.Resources>
<Button.Background>
<StaticResourceExtension ResourceKey="seperateResourceFilePinkBrush"/>
</Button.Background>
</Button>
Поскольку в этом примере элемент Button объявляет свойство MergedDictionaries, можно использовать ВСЕ ресурсы, объявленные в свободном файле XAML, как если бы эти ресурсы были объявлены локально (локально для элемента Button).
