Loading

WPF 给类库设置设计时使用的资源字典

在开发多语言版本时,我将界面显示的文本保存在语言资源zh.xaml和en.xaml中,但程序启动,加载语言资源时是外部的配置文件决定的,因此语言资源我无法添加在App.xaml文件中,而开发单个 XAML 界面时,设计器将会因为找不到资源文件的存在,而拿不到资源,每次遇到语言相关的资源键值,都需要手动去复制,非常麻烦,后续代码查看也不能直接跳转到对应的Key值上。
最佳的方法是和 Blend 一样,在设计时让设计器引用上某些资源,这样设计器就能工作。实现方法是在类库里面添加特殊的文件,这个特殊的文件有文件夹和命名的要求,这是在 VisualStudio 的设计器里面写常量固定的路径。在项目的Properties文件夹里面新建 DesignTimeResources.xaml 资源字典文件,这个文件的命名规则是有约定的,不推荐自己修改。或者在csproj 上添加如下代码:

  <ItemGroup>
    <Page Update="Properties\DesignTimeResources.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
      <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
    </Page>
  </ItemGroup>`

上面代码核心就是 ContainsDesignTimeResources 这个属性。理论上可以给任意的 xaml 文件设置这个属性,但是 XAML 设计器在很多 VS 版本上只读取此路径的文件。在 DesignTimeResources.xaml 资源字典添加对其他资源字典的引用,即可实现让类库的设计器找到资源,而在运行时是不会加载资源到内存。
最后将需要使用的资源文件中添加到DesignTimeResources.xaml文件中即可,如下所示:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="../zh.xaml"></ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

这样就可以在开发阶段,直接使用zh.xaml中的键值,也可以在xaml界面上直接跳到到该键值

posted @ 2023-04-21 09:47  Dwaynerbing  阅读(357)  评论(1编辑  收藏  举报