Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом примере показано, как определить ресурс и ссылаться на него. На ресурс можно ссылаться с помощью XAML или кода.
Пример XAML
В следующем примере определяются два типа ресурсов: ресурс SolidColorBrush и несколько Style ресурсов.
<Window.Resources>
<SolidColorBrush x:Key="MyBrush" Color="#05E0E9"/>
<Style TargetType="Border">
<Setter Property="Background" Value="#4E1A3D" />
<Setter Property="BorderThickness" Value="5" />
<Setter Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="#4E1A3D"/>
<GradientStop Offset="1.0" Color="Salmon"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TextBlock" x:Key="TitleText">
<Setter Property="FontSize" Value="18"/>
<Setter Property="Foreground" Value="#4E87D4"/>
<Setter Property="FontFamily" Value="Trebuchet MS"/>
<Setter Property="Margin" Value="0,10,10,10"/>
</Style>
<Style TargetType="TextBlock" x:Key="Label">
<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Margin" Value="0,3,10,0"/>
</Style>
</Window.Resources>
Ресурсы
SolidColorBrush ресурс MyBrush используется для определения значений нескольких свойств, каждое из которых принимает значение типа Brush. На этот ресурс ссылается x:Key значение.
<Border>
<StackPanel>
<TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
<TextBlock Style="{StaticResource Label}">Label</TextBlock>
<TextBlock HorizontalAlignment="Right" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
<Button HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
<Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
</StackPanel>
</Border>
В предыдущем примере MyBrush ресурс обращается с расширением StaticResource Markup. Ресурс назначается свойству, которое может принимать определенный тип ресурса. В этом случае свойства Background, Foreground и Fill.
Все ресурсы в словаре ресурсов должны предоставлять ключ. При определении стилей они могут опустить ключ, как описано в следующем разделе.
Ресурсы также запрашиваются в порядке, указанном в словаре, если вы используете расширение разметки StaticResource, чтобы ссылаться на них из другого ресурса. Убедитесь, что любой ресурс, на который вы ссылаетесь, определен в коллекции раньше, чем в том месте, где запрашивается этот ресурс. Дополнительные сведения см. в разделе "Статические ресурсы".
При необходимости можно обойти строгий порядок создания ссылок на ресурсы с помощью расширения разметки DynamicResource , чтобы ссылаться на ресурс во время выполнения, но следует учитывать, что этот DynamicResource метод имеет последствия для производительности. Дополнительные сведения см. в разделе "Динамические ресурсы".
Ресурсы стиля
Следующий пример ссылается на стили неявно и явно:
<Border>
<StackPanel>
<TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
<TextBlock Style="{StaticResource Label}">Label</TextBlock>
<TextBlock HorizontalAlignment="Right" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
<Button HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
<Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
</StackPanel>
</Border>
В предыдущем примере кода ресурсы Style и TitleText предназначены для каждого конкретного типа элемента управления. В этом случае они оба нацелены на TextBlock. Стили устанавливают различные свойства целевых управляющих элементов, когда ресурс стиля ссылается на свой ключ для свойства Style.
Хотя стиль и предназначен для элемента управления Border, он не определяет ключ. Если ключ опущен, тип целевого объекта TargetType неявно используется в качестве ключа для стиля. Если стиль имеет ключ к типу, он становится стилем по умолчанию для всех элементов управления этого типа, если эти элементы управления находятся в пределах области стиля. Дополнительные сведения см. в разделе Стили, DataTemplates и неявные ключи.
Примеры кода
Приведенные ниже фрагменты кода демонстрируют создание и настройку ресурсов с помощью кода
Создайте ресурс стиля
Создание ресурса и назначение его словарю ресурсов может произойти в любое время. Однако только элементы XAML, использующие синтаксис DynamicResource, автоматически обновляются с ресурсом после его создания.
Возьмём, к примеру, следующее окно. Он имеет четыре кнопки. Четвертая кнопка использует DynamicResource для стилизации. Однако этот ресурс еще не существует, поэтому он просто выглядит как обычная кнопка:
<StackPanel Margin="5">
<Button Click="Button_Click">Explicitly Styled</Button>
<Button>Unstyled</Button>
<Button>Unstyled</Button>
<Button Style="{DynamicResource ResourceKey=buttonStyle1}">Dynamically Styled</Button>
</StackPanel>
Следующий код вызывается при нажатии первой кнопки и выполняет следующие задачи:
- Создает несколько цветов для удобного доступа.
- Создает новый стиль.
- Назначает установщики для стиля.
- Добавляет стиль в качестве ресурса с именем
buttonStyle1в словарь ресурсов окна. - Назначает стиль непосредственно кнопке, вызываемой
Clickсобытием.
private void Button_Click(object sender, RoutedEventArgs e)
{
// Create colors
Color purple = (Color)ColorConverter.ConvertFromString("#4E1A3D");
Color white = Colors.White;
Color salmon = Colors.Salmon;
// Create a new style for a button
var buttonStyle = new Style(typeof(Button));
// Set the properties of the style
buttonStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(purple)));
buttonStyle.Setters.Add(new Setter(Control.ForegroundProperty, new SolidColorBrush(white)));
buttonStyle.Setters.Add(new Setter(Control.BorderBrushProperty, new LinearGradientBrush(purple, salmon, 45d)));
buttonStyle.Setters.Add(new Setter(Control.BorderThicknessProperty, new Thickness(5)));
// Set this style as a resource. Any DynamicResource tied to this key will be updated.
this.Resources["buttonStyle1"] = buttonStyle;
// Set this style directly to a button
((Button)sender).Style = buttonStyle;
}
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
'Create colors
Dim purple = DirectCast(ColorConverter.ConvertFromString("#4E1A3D"), Color)
Dim white = Colors.White
Dim salmon = Colors.Salmon
'Create a new style for a button
Dim buttonStyle As New Style()
'Set the properties of the style
buttonStyle.Setters.Add(New Setter(Control.BackgroundProperty, New SolidColorBrush(purple)))
buttonStyle.Setters.Add(New Setter(Control.ForegroundProperty, New SolidColorBrush(white)))
buttonStyle.Setters.Add(New Setter(Control.BorderBrushProperty, New LinearGradientBrush(purple, salmon, 45D)))
buttonStyle.Setters.Add(New Setter(Control.BorderThicknessProperty, New Thickness(5)))
'Set this style as a resource. Any DynamicResource looking for this key will be updated.
Me.Resources("buttonStyle1") = buttonStyle
'Set this style directly to a button
DirectCast(sender, Button).Style = buttonStyle
End Sub
После выполнения кода окно обновляется:
Обратите внимание, что стиль четвёртой кнопки был обновлён. Стиль был применен автоматически, так как кнопка использовала расширение разметки DynamicResource для ссылки на стиль, который еще не существует. После создания и добавления стиля в ресурсы окна она была применена к кнопке. Дополнительные сведения см. в разделе "Динамические ресурсы".
Поиск ресурса
Следующий код проходит по логическому дереву объекта XAML, в котором выполняется запуск, чтобы найти указанный ресурс. Ресурс может быть определен в самом объекте, он является родительским, вплоть до корневого каталога, самого приложения. Следующий код ищет ресурс, начиная с самой кнопки:
myButton.Style = myButton.TryFindResource("buttonStyle1") as Style;
myButton.Style = myButton.TryFindResource("buttonStyle1")
Явным образом ссылающийся на ресурс
Когда у вас есть ссылка на ресурс, полученная в результате поиска или его создания, её можно назначить свойству напрямую.
// Set this style as a resource. Any DynamicResource tied to this key will be updated.
this.Resources["buttonStyle1"] = buttonStyle;
'Set this style as a resource. Any DynamicResource looking for this key will be updated.
Me.Resources("buttonStyle1") = buttonStyle
См. также
.NET Desktop feedback