- StaticResourceは最初の値を使用します。DynamicResourceは最後の値を使用します。
- DynamicResourceはネストされたスタイルに使用できますが、StaticResourceは使用できません。
このネストされたスタイルディクショナリがあるとします。LightGreenはルートレベルにあり、Pinkはグリッド内にネストされています。
<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はボタンをライトグリーンとしてレンダリングします。これはスタイルで最初に見つかった値です。DynamicResourceは、グリッドをレンダリングするときに、LightGreenボタンをピンクとしてオーバーライドします。
StaticResource
DynamicResource
VS DesignerはDynamicResourceをStaticResourceとして扱うことに注意してください。最初の値を取得します。この場合、VS DesignerはボタンをLightGreenとしてレンダリングしますが、実際にはピンクになります。
ルートレベルのスタイル(LightGreen)が削除されると、StaticResourceはエラーをスローします。