wpf 静态资源 动态资源的使用

刚开始接触并学习wpf 对资源的使用不太明白

图片说明

代码如下(没有定义应用程序级的资源)
第二个按钮为什么不采用自己的资源而采用了window的资源?静态资源和动态资源的使用有何区别呢?

 <Window.Resources>

        <SolidColorBrush x:Key="ButtonBrush" Color="Red" />

    </Window.Resources>



    <StackPanel>

        <Button Margin="5" Content="Static Resource Button A" Background="{StaticResource ButtonBrush}" />

        <Button Margin="5" Content="Static Resource Button B" Background="{StaticResource ButtonBrush}">

            <Button.Resources>

                <SolidColorBrush x:Key="ButtonBrush" Color="Yellow" />

            </Button.Resources>
        </Button>

        <Button Margin="5" Content="Change Button Resource" Click="Button_Click" />

        <Button Margin="5" Content="Dynamic Resource Button A" Background="{DynamicResource ButtonBrush}" />

        <Button Margin="5" Content="Dynamic Resource Button B" Background="{DynamicResource ButtonBrush}">

            <Button.Resources>

                <SolidColorBrush x:Key="ButtonBrush" Color="Yellow" />

            </Button.Resources>

        </Button>

    </StackPanel>

这只是一个示例程序,当然把各种方式都给你展示一次。没有什么为什么。

他就是告诉你,如果两个都定义了,那么静态资源的优先级高,定义的资源不起效果,是红色,而最下面那个,动态资源的优先级低,所以是黄色。

不知道你说的第个是哪个?

如果你说的是<Button Margin="5" Content="Change Button Resource" Click="Button_Click" />

因为它既没有引用你这个UserControl中的静态资源,也没有引用动态资源,那就引用windows资源进行默认绘制.

关于资源,参考:
https://msdn.microsoft.com/zh-cn/library/ms750613.aspx#staticdynamic

下面是一个Style,你可用通过xaml的Style属性来引用.

<Style TargetType="Button">
  <Setter Property="Background">
    <Setter.Value>
      <LinearGradientBrush>
        <GradientStop Offset="0.0" Color="AliceBlue"/>
        <GradientStop Offset="1.0" Color="Salmon"/>           
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>  
  <Setter Property="FontSize" Value="18"/>
</Style>
<SolidColorBrush x:Key="ButtonBrush" Color="Red" />

上面的代码指定了一个x:Key,就相当于指定了一个字典中的索引,或者叫键,你必须用这个键来访问这项资源.

下面的代码和你的代码类似,必须按x:Key指定资源,无论是静态还是动态指定.

<Window>
   2:     <Grid>
   3:         <Grid.Resources>
   4:             <Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
   5:                 <Setter Property="Height" Value="22"/>
   6:                 <Setter Property="Width" Value="60"/>
   7:             </Style>
   8:         </Grid.Resources>
   9:         <Button Content="Button" Style="{StaticResource ButtonStyle}"/>
  10:         <Button Content="Button" Style="{StaticResource ButtonStyle}" Margin="156,144,286,145" />
  11:     </Grid>
  12: </Window>

而下面的代码,是隐式指定,所谓隐式,就是你没有指定x:Key,但它隐式推断为typeOf(Button),这样,就可以不指定x:Key来修改你资源指定层次(控件字典、窗口字典、还是应用程序字典)的Button风格.

   1: <Window>
   2:     <Grid>
   3:         <Grid.Resources>
   4:             <Style TargetType="{x:Type Button}">
   5:                 <Setter Property="Height" Value="22"/>
   6:                 <Setter Property="Width" Value="60"/>
   7:             </Style>
   8:         </Grid.Resources>
   9:         <Button x:Name="button1" Style="{x:Null}"/>
  10:         <Button x:Name="button2" Margin="156,144,286,145" />
  11:         <Button x:Name="button3" Margin="196,144,0,145" />
  12:     </Grid>
  13: </Window>