通知公告
资源字典(MPF实例教程第十二课)
日期:2015-12-17  发布人:admin  浏览量:629

  通过前面课程的学习,我们已经比较完整了解MPF的资源类型、属性设置以及怎样显示一个控件,包括界面的布局,现在我们总结下。

  在MPF中,有三种文件类型:Application、布局文件、资源字典,前面两种我们已经接触过了。

  Application文件:一个系统中通常仅仅有一个Application文件,比如Application.xml,当然也可以叫其它名字。

  布局文件:描述界面的布局,比如有多少Button,Button是在上还是下等,通常其根节点是Window类型的控件元素,当然也可以是其它类型的控件元素。

  资源字典:包含一系列资源的集合,比如String、Float等基本资源,ControlTemplate、Style等复杂的资源。

  这一课我们学习下MPF中的资源字典(ResourceDictionary),资源字典可以是独立的文件保存,也可以嵌入控件元素或Application应用元素。

  嵌入型的资源字典在前面课程我们一直在使用,比如Application.xml中的Application.Resources节点就是内嵌在Application中的资源字典,控件元素也是类似的,比如我们需要在Window中嵌入资源字典,可以这样写:

  <Window Name="" >

    <Window.Resources>

      <SolidColorBrush x:Key="bkgnd" Color="Green" />

     </Window.Resources>

  </Window>

  从上面可以看出,控件元素中嵌入资源写法就是:控件元素类型名称.Resources,比较简单、直接,在控件元素中定义的资源是有访问范围的(元素本身极其子控件元素可以访问)。

  让我们看下一个独立的资源字典的构成和标准写法:

<ResourceDictionary>

   <SolidColorBrush x:Key="bkgnd" Color="Green" />

   …

  <Style TargetType="Button" >

    …

  </Style>

</ResourceDictionary>

ResourceDictionary下每一个子节点都是一个资源项,资源除了Style外都必须有x:Key标识资源,并且在本身资源字典范围内唯一。

上面仅仅展示了原生的资源项,那么一个资源字典可不可以引用其它的资源字典呢?答案是可以,通过ResourceDictionary.MergedDictionaries节点来引入对其它资源,我们看看在配置文件中怎么样引入一个外部定义好的资源:

<ResourceDictionary>

   <SolidColorBrush x:Key="bkgnd" Color="Green" />

   <ResourceDictionary.MergedDictionaries>

      <ResourceDictionary Source=”default.xml” />

      <ResourceDictionary>

         <SolidColorBrush x:Key="br" Color="Blue" />

      </ResourceDictionary>

   </ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

我们可以在ResourceDictionary.MergedDictionaries节点引用外部做好的资源,还可以直接在里面定义资源项,这里我们要注意,如果在控件元素里引入其它资源后,不能采用简化的方式定义资源,需要完整的使用ResourceDictionary来描述资源字典,比如:

<Window Name="" >

       <Window.Resources>

          <SolidColorBrush x:Key="bkgnd" Color="Green" />

       </Window.Resources>

</Window>

这样定义Window的资源是可以的,这是简化的写法,如果引用其它资源:

<Window Name="" >

       <Window.Resources>

          <SolidColorBrush x:Key="bkgnd" Color="Green" />

       <ResourceDictionary.MergedDictionaries>

          <ResourceDictionary Source=”default.xml” />

          <ResourceDictionary>

            <SolidColorBrush x:Key="br" Color="Blue" />

          </ResourceDictionary>

           </ResourceDictionary.MergedDictionaries>

       </Window.Resources>

</Window>

上面这种写法是错误,因为引用其它资源字典,所以需要使用ResourceDictionary来完整定义资源:

<Window Name="" >

       <Window.Resources>

          <ResourceDictionary>

             <SolidColorBrush x:Key="bkgnd" Color="Green" />

          <ResourceDictionary.MergedDictionaries>

             <ResourceDictionary Source=”default.xml” />

             <ResourceDictionary>

               <SolidColorBrush x:Key="br" Color="Blue" />

             </ResourceDictionary>

              </ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

       </Window.Resources>

</Window>

上述写法才是正确的。

最后我们说下资源字典里的资源引用顺序,后面定义的资源可以引用前面定义的资源,这个规则对ResourceDictionary.MergedDictionaries里面的资源一样有效。

现在,我们使用本课介绍的资源字典用法改造下我们的SDemon,前面我们的资源都是定义在Application.xml中,我们新建一个default.xml的资源字典,然后把Application.xml的资源都移到default.xml,修改后Application.xml内容如下:

<?xml encoding="utf-8" ?>

<Application StartupUri="/SDemon_12;/MainWindow.xml" Author="QQ:386666951" >

    <Application.Resources>

        <ResourceDictionary >

            <ResourceDictionary.MergedDictionaries>

                <ResourceDictionary Source="/SDemon_12;default.xml" />

            </ResourceDictionary.MergedDictionaries>>

        </ResourceDictionary>>

    </Application.Resources>

</Application>

 

  是不是显得简洁多了。

  到这一课为止,我们介绍完了MPF布局、资源等配置。