Стилизация и использование шаблоновStyling and Templating

Стилизация и использование шаблонов Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) относятся к набору возможностей (стили, шаблоны, триггеры и раскадровки), которые позволяют разработчикам и дизайнерам создавать визуально привлекательные эффекты, а также создавать согласованный внешний вид своих продуктов.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) styling and templating refer to a suite of features (styles, templates, triggers, and storyboards) that allow developers and designers to create visually compelling effects and to create a consistent appearance for their product. Несмотря на то что разработчики и дизайнеры могут создавать внешний вид отдельно для каждого приложения, надежная модель стилизации и использования шаблонов необходима для поддержки и совместного использования внешнего вида как внутри одного приложения, так и в ряде приложений.Although developers and or designers can customize the appearance extensively on an application-by-application basis, a strong styling and templating model is necessary to allow maintenance and sharing of the appearance within and among applications. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) предоставляет такую модель.provides that model.

Еще одной возможностью модели стилизации WPFWPF является разделение представления и логики.Another feature of the WPFWPF styling model is the separation of presentation and logic. Это означает, что дизайнеры могут создавать внешний вид приложения только с помощью XAMLXAML в то же самое время, когда разработчики работают над логикой программы, используя языки C# или Visual Basic.This means that designers can work on the appearance of an application by using only XAMLXAML at the same time that developers work on the programming logic by using C# or Visual Basic.

В этом обзоре основное внимание уделяется аспектам стилизации и использования шаблонов приложения и не рассматриваются концепции привязки данных.This overview focuses on the styling and templating aspects of the application and does not discuss any data binding concepts. Подробнее о привязке данных см. в разделе Общие сведения о привязке данных.For information about data binding, see Data Binding Overview.

Также важно иметь представление о ресурсах, которые позволяют повторно использовать стили и шаблоны.In addition, it is important to understand resources, which are what enable styles and templates to be reused. Дополнительные сведения о ресурсах см. в разделе Ресурсы XAML.For more information about resources, see XAML Resources.

Пример стилизации и использования шаблоновStyling and Templating Sample

В примерах кода, приведенных в этом обзоре, используется простой пример фото, показанный ниже:The code examples used in this overview are based on a simple photo sample shown in the following illustration:

Стилизированный ListViewStyled ListView

В этом простом примере фото стилизация и шаблоны применяются для создания привлекательного интерфейса.This simple photo sample uses styling and templating to create a visually compelling user experience. Пример содержит два TextBlock элементов и ListBox элемента управления, привязанный к списку изображений.The sample has two TextBlock elements and a ListBox control that is bound to a list of images. Полный пример см. в разделе Вводная часть примера стилизации и использования шаблонов.For the complete sample, see Introduction to Styling and Templating Sample.

Основы стилейStyle Basics

Можно представить себе Style как удобный способ применения набора значений свойств к более чем одного элемента.You can think of a Style as a convenient way to apply a set of property values to more than one element. Например, рассмотрим следующие TextBlock элементов и их внешний вид по умолчанию:For example, consider the following TextBlock elements and their default appearance:

<TextBlock>My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>

Снимок экрана стилейStyling sample screenshot

Можно изменить внешний вид по умолчанию, задав свойства, такие как FontSize и FontFamily, на каждом TextBlock напрямую.You can change the default appearance by setting properties, such as FontSize and FontFamily, on each TextBlock element directly. Тем не менее если вы хотите, чтобы ваши TextBlock элементов совместно использовать некоторые свойства, можно создать Style в Resources части вашей XAMLXAML файл, как показано ниже:However, if you want your TextBlock elements to share some properties, you can create a Style in the Resources section of your XAMLXAML file, as shown here:

<Window.Resources>
<!--A Style that affects all TextBlocks-->
<Style TargetType="TextBlock">
  <Setter Property="HorizontalAlignment" Value="Center" />
  <Setter Property="FontFamily" Value="Comic Sans MS"/>
  <Setter Property="FontSize" Value="14"/>
</Style>
</Window.Resources>

При задании TargetType стиля TextBlock , стиль применяется ко всем TextBlock элементы в окне.When you set the TargetType of your style to the TextBlock type, the style is applied to all the TextBlock elements in the window.

Теперь TextBlock элементов будет выглядеть следующим образом:Now the TextBlock elements appear as follows:

Снимок экрана стилейStyling sample screenshot

Расширение стилейExtending Styles

Возможно, вам необходимо два TextBlock элементы, чтобы совместно использовать некоторые свойства, такие как FontFamily и выровнять по центру HorizontalAlignment, и при этом текст «Мои рисунки» обладал некоторыми дополнительными свойствами.Perhaps you want your two TextBlock elements to share some property values, such as the FontFamily and the centered HorizontalAlignment, but you also want the text "My Pictures" to have some additional properties. Это можно сделать, создав новый стиль на основе первого стиля, как показано ниже:You can do that by creating a new style that is based on the first style, as shown here:

<Window.Resources>
<!--A Style that extends the previous TextBlock Style-->
<!--This is a "named style" with an x:Key of TitleText-->
<Style BasedOn="{StaticResource {x:Type TextBlock}}"
       TargetType="TextBlock"
       x:Key="TitleText">
  <Setter Property="FontSize" Value="26"/>
  <Setter Property="Foreground">
  <Setter.Value>
      <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
        <LinearGradientBrush.GradientStops>
          <GradientStop Offset="0.0" Color="#90DDDD" />
          <GradientStop Offset="1.0" Color="#5BFFFF" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>
</Style>
</Window.Resources>

Обратите внимание, что предыдущий стиль получил атрибут x:Key.Notice that the previous style is given an x:Key. Чтобы применить стиль, вы установите Style свойство вашей TextBlock для x:Key значение, как показано ниже:To apply the style, you set the Style property on your TextBlock to the x:Key value, as shown here:

<TextBlock Style="{StaticResource TitleText}" Name="textblock1">My Pictures</TextBlock>
<TextBlock>Check out my new pictures!</TextBlock>

Это TextBlock теперь имеет стиль HorizontalAlignment значение Center, FontFamily значение Comic Sans MS, FontSize значение 26 и Foreground значение LinearGradientBrush показано в примере.This TextBlock style now has a HorizontalAlignment value of Center, a FontFamily value of Comic Sans MS, a FontSize value of 26, and a Foreground value set to the LinearGradientBrush shown in the example. Обратите внимание, что этот параметр переопределяет FontSize значение базового стиля.Notice that it overrides the FontSize value of the base style. Если имеется более одного Setter одного свойства Style, Setter то есть объявленный последнего имеет больший приоритет.If there is more than one Setter setting the same property in a Style, the Setter that is declared last takes precedence.

Ниже показано TextBlock элементов будет выглядеть так:The following shows what the TextBlock elements now look like:

Стилизированный TextBlocksStyled TextBlocks

Это TitleText стиля расширяет стиль, который был создан для TextBlock типа.This TitleText style extends the style that has been created for the TextBlock type. Можно также расширить стиль, имеющий атрибут x:Key, используя значение атрибута x:Key.You can also extend a style that has an x:Key by using the x:Key value. Например, см. пример для BasedOn свойство.For an example, see the example provided for the BasedOn property.

Связь свойства TargetType и атрибута x:KeyRelationship of the TargetType Property and the x:Key Attribute

Как показано в первом примере, установка TargetType свойства TextBlock без присвоения стилю x:Key вызывает стиль, применяемый ко всем TextBlock элементов.As shown in the first example, setting the TargetType property to TextBlock without assigning the style an x:Key causes the style to be applied to all TextBlock elements. В этом случае для x:Key неявно устанавливается значение {x:Type TextBlock}.In this case, the x:Key is implicitly set to {x:Type TextBlock}. Это означает, что если явно задать x:Key значение, отличное от {x:Type TextBlock}, Style применяется не ко всем TextBlock элементов автоматически.This means that if you explicitly set the x:Key value to anything other than {x:Type TextBlock}, the Style is not applied to all TextBlock elements automatically. Вместо этого необходимо применить стиль (с помощью x:Key значение) для TextBlock элементы явным образом.Instead, you must apply the style (by using the x:Key value) to the TextBlock elements explicitly. Если стиль находится в разделе ресурсов и не устанавливайте TargetType свойство в стиле, то необходимо предоставить x:Key.If your style is in the resources section and you do not set the TargetType property on your style, then you must provide an x:Key.

Помимо предоставления значение по умолчанию для x:Key, TargetType свойство задает тип, к которому применяются свойства метода задания.In addition to providing a default value for the x:Key, the TargetType property specifies the type to which setter properties apply. Если вы не укажете TargetType, необходимо уточнить свойства в вашей Setter объектов с именем класса, используя синтаксис Property="ClassName.Property".If you do not specify a TargetType, you must qualify the properties in your Setter objects with a class name by using the syntax Property="ClassName.Property". Например, вместо того чтобы задавать Property="FontSize", необходимо задать Property для "TextBlock.FontSize" или "Control.FontSize".For example, instead of setting Property="FontSize", you must set Property to "TextBlock.FontSize" or "Control.FontSize".

Также обратите внимание, что многие элементы управления WPFWPF являются сочетанием других элементов управления WPFWPF.Also note that many WPFWPF controls consist of a combination of other WPFWPF controls. Если создать стиль, который применяется ко всем элементам управления типа, можно получить непредвиденные результаты.If you create a style that applies to all controls of a type, you might get unexpected results. Например, если создать стиль, предназначенный TextBlock введите в Window, стиль применяется ко всем TextBlock элементов управления в окне, даже если TextBlock является частью другого элемента управления, такие как ListBox.For example, if you create a style that targets the TextBlock type in a Window, the style is applied to all TextBlock controls in the window, even if the TextBlock is part of another control, such as a ListBox.

Стили и ресурсыStyles and Resources

Можно использовать стиль для любого элемента, который является производным от FrameworkElement или FrameworkContentElement.You can use a style on any element that derives from FrameworkElement or FrameworkContentElement. Наиболее распространенный способ объявления стиля — это его объявление в качестве ресурса в разделе Resources файла XAMLXAML, как было показано в предыдущих примерах.The most common way to declare a style is as a resource in the Resources section in a XAMLXAML file, as shown in the previous examples. Так как стили являются ресурсами, для них действуют те же правила области видимости, которые применяются ко всем ресурсам. Область, в которой объявлен стиль, влияет на область применения стиля.Because styles are resources, they obey the same scoping rules that apply to all resources; where you declare a style affects where the style can be applied. Например, если объявить стиль в корневом элементе файла XAMLXAML определения приложения, стиль может использоваться в любом месте приложения.For example, if you declare the style in the root element of your application definition XAMLXAML file, the style can be used anywhere in your application. Если вы создаете приложение навигации и объявляете стиль в одном из файлов XAMLXAML приложения, стиль можно будет использовать только в этом файле XAMLXAML.If you create a navigation application and declare the style in one of the application's XAMLXAML files, the style can be used only in that XAMLXAML file. Подробнее о правилах видимости ресурсов см. в разделе Ресурсы XAML.For more information about scoping rules for resources, see XAML Resources.

Кроме того, дополнительные сведения о стилях и ресурсах можно найти в разделе Совместно используемые ресурсы и темы данного обзора.In addition, you can find more information about styles and resources in Shared Resources and Themes later in this overview.

Программная установка стилейSetting Styles Programmatically

Чтобы программным способом назначить именованный стиль элементу, Возьмите этот стиль из коллекции ресурсов и его назначение этого элемента Style свойство.To assign a named style to an element programmatically, get the style from the resources collection and assign it to the element's Style property. Обратите внимание, что элементы в коллекции ресурсов имеют тип Object.Note that the items in a resources collection are of type Object. Таким образом, необходимо привести полученный стиль для Style перед назначением его Style свойство.Therefore, you must cast the retrieved style to a Style before assigning it to the Style property. Например, чтобы задать определенный TitleText стиль над TextBlock с именем textblock1, выполните следующие действия:For example, to set the defined TitleText style on a TextBlock named textblock1, do the following:

textblock1.Style = (Style)(this.Resources["TitleText"]);
textblock1.Style = CType(Me.Resources("TitleText"), Style)

Обратите внимание, что после применения стиля он фиксируется и не может быть изменен.Note that once a style has been applied, it is sealed and cannot be changed. Если необходимо динамически изменить стиль, который уже был применен, нужно создать новый стиль для замены существующего.If you want to dynamically change a style that has already been applied, you must create a new style to replace the existing one. Дополнительные сведения см. в описании свойства IsSealed.For more information, see the IsSealed property.

Можно создать объект, который выбирает стиль, который нужно применить, основываясь на собственной логике.You can create an object that chooses a style to apply based on custom logic. Например, см. пример для StyleSelector класса.For an example, see the example provided for the StyleSelector class.

Привязки, динамические ресурсы и обработчики событийBindings, Dynamic Resources, and Event Handlers

Обратите внимание, что свойство Setter.Value можно использовать для задания привязки расширения разметки или расширения разметки DynamicResource.Note that you can use the Setter.Value property to specify a Binding Markup Extension or a DynamicResource Markup Extension. Дополнительные сведения см. в примерах для Setter.Value свойство.For more information, see the examples provided for the Setter.Value property.

На данный момент этот обзор касается только использования методов задания для установки значений свойств.So far, this overview only discusses the use of setters to set property value. В стиле также можно задать обработчики событий.You can also specify event handlers in a style. Дополнительные сведения см. в разделе EventSetter.For more information, see EventSetter.

Шаблоны данныхData Templates

В этом примере приложения есть ListBox элемента управления, привязанный к списку фотографий:In this sample application, there is a ListBox control that is bound to a list of photos:

<ListBox ItemsSource="{Binding Source={StaticResource MyPhotos}}"
         Background="Silver" Width="600" Margin="10" SelectedIndex="0"/>

Это ListBox в данный момент выглядит следующим образом:This ListBox currently looks like the following:

ListBox до применения шаблонаListBox before applying template

Большинство элементов управления имеют некое содержимое, и это содержимое часто поступает из данных, к которым осуществляется привязка.Most controls have some type of content, and that content often comes from data that you are binding to. В этом примере такими данными является список фотографий.In this sample, the data is the list of photos. В WPFWPF, использовании DataTemplate для определения визуального представления данных.In WPFWPF, you use a DataTemplate to define the visual representation of data. По сути, что вы поместите в DataTemplate определяет вид данных в отображаемом приложении.Basically, what you put into a DataTemplate determines what the data looks like in the rendered application.

В нашем примере приложения каждый пользовательский объект Photo имеет свойство Source строкового типа, которое задает путь к файлу изображения.In our sample application, each custom Photo object has a Source property of type string that specifies the file path of the image. Сейчас объекты фотографий отображаются как пути к файлам.Currently, the photo objects appear as file paths.

Чтобы фотографии отображались как изображения, создании DataTemplate как ресурс:For the photos to appear as images, you create a DataTemplate as a resource:

<Window.Resources>
<!--DataTemplate to display Photos as images
    instead of text strings of Paths-->
<DataTemplate DataType="{x:Type local:Photo}">
  <Border Margin="3">
    <Image Source="{Binding Source}"/>
  </Border>
</DataTemplate>
</Window.Resources>

Обратите внимание, что DataType очень похоже на свойство TargetType свойство Style.Notice that the DataType property is very similar to the TargetType property of the Style. Если ваш DataTemplate находится в разделе ресурсов, при указании DataType свойство с типом и не назначаете ему x:Key, DataTemplate будет применяться при каждом отображении этого типа.If your DataTemplate is in the resources section, when you specify the DataType property to a type and not assign it an x:Key, the DataTemplate is applied whenever that type appears. У вас всегда есть возможность назначения DataTemplate с x:Key и затем задать его в качестве StaticResource для свойства, принимающие DataTemplate типы, такие как ItemTemplate свойство или ContentTemplate свойство.You always have the option to assign the DataTemplate with an x:Key and then set it as a StaticResource for properties that take DataTemplate types, such as the ItemTemplate property or the ContentTemplate property.

По сути DataTemplate в приведенном выше примере определяет, что при имеется Photo объекта, он должен быть Image в Border.Essentially, the DataTemplate in the above example defines that whenever there is a Photo object, it should appear as an Image within a Border. С этим DataTemplate, наше приложение теперь выглядит следующим образом:With this DataTemplate, our application now looks like this:

ФотоизображениеPhoto image

Модель использования шаблонов данных предоставляет и другие возможности.The data templating model provides other features. Например, при отображении данных коллекции, содержащей другие коллекции с помощью HeaderedItemsControl введите, например Menu или TreeView, имеется HierarchicalDataTemplate.For example, if you are displaying collection data that contains other collections using a HeaderedItemsControl type such as a Menu or a TreeView, there is the HierarchicalDataTemplate. Другой возможностью шаблонов данных является DataTemplateSelector, который позволяет выбрать DataTemplate для использования на основе пользовательской логики.Another data templating feature is the DataTemplateSelector, which allows you to choose a DataTemplate to use based on custom logic. Дополнительные сведения см. в разделе Общие сведения о шаблонах данных, в котором более подробно рассматриваются различные возможности использования шаблонов данных.For more information, see Data Templating Overview, which provides a more in-depth discussion of the different data templating features.

Шаблоны элементов управленияControl Templates

В WPFWPF, ControlTemplate элемента управления определяет внешний вид элемента управления.In WPFWPF, the ControlTemplate of a control defines the appearance of the control. Можно изменить структуру и внешний вид элемента управления, определив новый ControlTemplate для элемента управления.You can change the structure and appearance of a control by defining a new ControlTemplate for the control. Во многих случаях это является достаточно гибким средством, и вам не придется писать собственные пользовательские элементы управления.In many cases, this gives you enough flexibility so that you do not have to write your own custom controls. Подробнее см. в разделе Настройка внешнего вида существующего элемента управления путем создания объекта ControlTemplate.For more information, see Customizing the Appearance of an Existing Control by Creating a ControlTemplate.

ТриггерыTriggers

Триггер задает значения свойств или активирует различные действия (например, анимацию) при изменении значения свойства или при возникновении какого-либо события.A trigger sets properties or starts actions, such as an animation, when a property value changes or when an event is raised. Style, ControlTemplate, и DataTemplate все имеют Triggers свойство, которое может содержать набор триггеров.Style, ControlTemplate, and DataTemplate all have a Triggers property that can contain a set of triggers. Существуют различные типы триггеров.There are various types of triggers.

Триггеры свойствProperty Triggers

Объект Trigger , задает значения свойств или активирует действия на основе значения свойства, называется триггером свойства.A Trigger that sets property values or starts actions based on the value of a property is called a property trigger.

Чтобы продемонстрировать использование триггеров свойств, вы можете сделать каждую ListBoxItem частично прозрачным, если он выбран.To demonstrate how to use property triggers, you can make each ListBoxItem partially transparent unless it is selected. Следующий стиль устанавливает Opacity значение ListBoxItem для 0.5.The following style sets the Opacity value of a ListBoxItem to 0.5. Когда IsSelected свойство true, но при этом Opacity присваивается 1.0:When the IsSelected property is true, however, the Opacity is set to 1.0:

<Style TargetType="ListBoxItem">
  <Setter Property="Opacity" Value="0.5" />
  <Setter Property="MaxHeight" Value="75" />
  <Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Setter Property="Opacity" Value="1.0" />
    </Trigger>
  </Style.Triggers>
</Style>

В этом примере используется Trigger для задания значения свойства, но Обратите внимание, что Trigger класс также имеет EnterActions и ExitActions свойства, позволяющие триггера для выполнения действия.This example uses a Trigger to set a property value, but note that the Trigger class also has the EnterActions and ExitActions properties that enable a trigger to perform actions.

Обратите внимание, что MaxHeight свойство ListBoxItem присваивается 75.Notice that the MaxHeight property of the ListBoxItem is set to 75. На следующем рисунке третий элемент является выбранным:In the following illustration, the third item is the selected item:

Стилизированный ListViewStyled ListView

Объекты EventTrigger и раскадровкиEventTriggers and Storyboards

Другой тип триггера — EventTrigger, которая запускает набор действий в зависимости от возникновения события.Another type of trigger is the EventTrigger, which starts a set of actions based on the occurrence of an event. Например, следующая EventTrigger объекта задают, когда указатель мыши попадает ListBoxItem, MaxHeight анимирует свойство в значение 90 через 0.2 второй период.For example, the following EventTrigger objects specify that when the mouse pointer enters the ListBoxItem, the MaxHeight property animates to a value of 90 over a 0.2 second period. Когда указатель мыши перемещается за пределы этого элемента, свойство возвращается к исходному значению в течение 1 сек.When the mouse moves away from the item, the property returns to the original value over a period of 1 second. Обратите внимание на то, как это не требуется указывать To значение MouseLeave анимации.Note how it is not necessary to specify a To value for the MouseLeave animation. Анимация сама может отслеживать исходное значение.This is because the animation is able to keep track of the original value.

<EventTrigger RoutedEvent="Mouse.MouseEnter">
  <EventTrigger.Actions>
    <BeginStoryboard>
      <Storyboard>
        <DoubleAnimation
          Duration="0:0:0.2"
          Storyboard.TargetProperty="MaxHeight"
          To="90"  />
      </Storyboard>
    </BeginStoryboard>
  </EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave">
  <EventTrigger.Actions>
    <BeginStoryboard>
      <Storyboard>
        <DoubleAnimation
          Duration="0:0:1"
          Storyboard.TargetProperty="MaxHeight"  />
      </Storyboard>
    </BeginStoryboard>
  </EventTrigger.Actions>
</EventTrigger>

Подробнее см. в разделе Общие сведения о раскадровках.For more information, see the Storyboards Overview.

На следующем рисунке указатель мыши указывает на третий элемент:In the following illustration, the mouse is pointing to the third item:

Снимок экрана стилейStyling sample screenshot

Объекты MultiTrigger, DataTrigger и MultiDataTriggerMultiTriggers, DataTriggers, and MultiDataTriggers

В дополнение к Trigger и EventTrigger, существуют другие типы триггеров.In addition to Trigger and EventTrigger, there are other types of triggers. MultiTrigger позволяет задавать значения свойств на основе нескольких условий.MultiTrigger allows you to set property values based on multiple conditions. Использовании DataTrigger и MultiDataTrigger Если это свойство условия имеет привязкой к данным.You use DataTrigger and MultiDataTrigger when the property of your condition is data-bound.

Общие ресурсы и темыShared Resources and Themes

Типичное приложение Windows Presentation Foundation (WPF) может иметь несколько ресурсов пользовательского интерфейса (UI), которые применяются в рамках всего приложения.A typical Windows Presentation Foundation (WPF) application might have multiple user interface (UI) resources that are applied throughout the application. В совокупности этот набор ресурсов можно рассматривать как тему приложения.Collectively, this set of resources can be considered the theme for the application. Windows Presentation Foundation (WPF) обеспечивает поддержку для упаковки ресурсов пользовательского интерфейса как тему с помощью словаря ресурсов, который инкапсулируется как ResourceDictionary класса.Windows Presentation Foundation (WPF) provides support for packaging user interface (UI) resources as a theme by using a resource dictionary that is encapsulated as the ResourceDictionary class.

Темы Windows Presentation Foundation (WPF) определяются с помощью механизмов стилизации и шаблонов, предоставляющей Windows Presentation Foundation (WPF) для настройки отображения любого элемента.Windows Presentation Foundation (WPF) themes are defined by using the styling and templating mechanism that Windows Presentation Foundation (WPF) exposes for customizing the visuals of any element.

Ресурсы темы Windows Presentation Foundation (WPF), хранятся в словарях внедренных ресурсов.Windows Presentation Foundation (WPF) theme resources are stored in embedded resource dictionaries. Эти словари ресурсов должны быть внедрены в подписанную сборку и могут быть внедрены либо в ту же сборку, что и сам код, либо в параллельную сборку.These resource dictionaries must be embedded within a signed assembly, and can either be embedded in the same assembly as the code itself or in a side-by-side assembly. В случае библиотеки PresentationFramework.dll, сборку, которая содержит элементы управления Windows Presentation Foundation (WPF), ресурсы тем находятся в ряде side-by-side сборок.In the case of PresentationFramework.dll, the assembly which contains Windows Presentation Foundation (WPF) controls, theme resources are in a series of side-by-side assemblies.

Тема становится последним местом поиска стиля элемента.The theme becomes the last place to look when searching for the style of an element. Как правило, процесс поиска начинается с прохода вверх по дереву элементов в поисках соответствующего ресурса, затем выполняется поиск в коллекции ресурсов приложения и, наконец, в последнюю очередь осуществляется запрос к системе.Typically, the search will begin by walking up the element tree searching for an appropriate resource, then look in the application resource collection and finally query the system. Это дает разработчикам приложений возможность переопределить стиль для любого объекта на уровне дерева или приложения до достижения темы.This gives application developers a chance to redefine the style for any object at the tree or application level before reaching the theme.

Словари ресурсов, оформленные в виде отдельных файлов, позволяют повторно использовать тему в нескольких приложениях.You can define resource dictionaries as individual files that enable you to reuse a theme across multiple applications. Также можно создать изменяемые темы, определив несколько словарей ресурсов, которые обеспечивают одни и те же типы ресурсов, но с разными значениями.You can also create swappable themes by defining multiple resource dictionaries that provide the same types of resources but with different values. Переопределение этих стилей или других ресурсов на уровне приложения является рекомендуемым способом смены тем приложения.Redefining these styles or other resources at the application level is the recommended approach for skinning an application.

Для совместного использования набора ресурсов, включая стили и шаблоны в приложениях, можно создать XAMLXAML файл и определить ResourceDictionary.To share a set of resources, including styles and templates, across applications, you can create a XAMLXAML file and define a ResourceDictionary. Например, посмотрите на следующую иллюстрацию — часть примера "Стилизация с помощью ControlTemplate":For example, take a look at the following illustration that shows part of the Styling with ControlTemplates Sample:

Примеры шаблонов элементов управленияControl Template Examples

Если взглянуть на файлы XAMLXAML в примере, можно заметить, что все файлы имеют следующий код:If you look at the XAMLXAML files in the sample, you will notice that the files all have the following:

<ResourceDictionary.MergedDictionaries>
  <ResourceDictionary Source="Shared.xaml" />
</ResourceDictionary.MergedDictionaries>

Это совместное использование shared.xaml, который определяет ResourceDictionary , содержащий набор стилей и ресурсов кисти, позволяющий элементам управления, в примере, чтобы иметь согласованный вид.It is the sharing of shared.xaml, which defines a ResourceDictionary that contains a set of style and brush resources that enables the controls in the sample to have a consistent look.

Подробнее см. в разделе Объединенные словари ресурсов.For more information, see Merged Resource Dictionaries.

Если вы создаете тему для пользовательского элемента управления, ознакомьтесь с разделом "Внешняя библиотека элементов управления" в материале Общие сведения о разработке элементов управления.If you are creating a theme for you custom control, see the External Control Library section of the Control Authoring Overview.

См. такжеSee also