- StaticResource 使用第一个值。DynamicResource 使用最后一个值。
- DynamicResource 可用于嵌套样式,StaticResource 不能。
假设你有这个嵌套的 Style 字典。LightGreen 位于根级别,而 Pink 嵌套在 Grid 中。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Grid}">
<Style.Resources>
<Style TargetType="{x:Type Button}" x:Key="ConflictButton">
<Setter Property="Background" Value="Pink"/>
</Style>
</Style.Resources>
</Style>
<Style TargetType="{x:Type Button}" x:Key="ConflictButton">
<Setter Property="Background" Value="LightGreen"/>
</Style>
</ResourceDictionary>
鉴于:
<Window x:Class="WpfStyleDemo.ConflictingStyleWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ConflictingStyleWindow" Height="100" Width="100">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/ConflictingStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Button Style="{DynamicResource ConflictButton}" Content="Test"/>
</Grid>
</Window>
StaticResource 会将按钮呈现为 LightGreen,这是它在样式中找到的第一个值。DynamicResource 将在呈现网格时将 LightGreen 按钮覆盖为粉红色。
静态资源
动态资源
请记住,VS Designer 将 DynamicResource 视为 StaticResource。它将获得第一个值。在这种情况下,VS Designer 会将按钮呈现为 LightGreen,尽管它实际上最终呈现为 Pink。
当根级样式 (LightGreen) 被移除时,StaticResource 会抛出错误。