如何在设计时加载WPF资源字典

10

我有一个 WPF 窗口,在其中一些属性被定义为动态资源,就像这样:

<Window x:Class="LocSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        MinHeight="350" MinWidth="525"
        Title="{DynamicResource ResourceKey=ResId_Title}"
        FlowDirection="{DynamicResource ResId_FlowDirection_Default}" >
    <Grid>
       <Label Content="{DynamicResource ResId_FirstName}" />  
    </Grid>
</Window>

ResourceDictionary 在运行时被加载以反映用户选择的语言。并且使用户可以在运行时切换语言。

这在运行时很好用,但在设计时,资源定义的属性不会显示出来。我明白设计师无法显示它们,因为它们在设计时没有定义。

我需要一种在设计时加载默认 ResourceDictionary 的方法,以便设计师可以显示任何东西。


由于这个问题有点老,很多答案已经过时了:我想指出的是,Expression Blend(我不知道过去是否允许)支持设计时样式。 - Warty
1个回答

9

编辑:

在 Blend 中,您可以使用“设计时资源字典”文件来实现此操作。Visual Studio 可以读取该文件,但无法创建该文件的工具。但是,如果您不害怕项目文件,可以手动完成。

  1. 将一个名为 DesignTimeResources.xaml 的文件添加到您的项目中。
  2. 打开您的项目文件(*.csproj),并找到 DesignTimeResources.xaml 文件的注册。
  3. 将此注册替换为以下代码
<Page Include="Properties\DesignTimeResources.xaml" Condition="'$(DesignTime)'=='true' OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)') AND '$(BuildingInsideVisualStudio)'!='true' AND '$(BuildingInsideExpressionBlend)'!='true')">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
  <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
</Page>

现在您可以将需要的所有资源字典合并到文件中。编译器会忽略它,但设计师不会。
更多详细信息请参见非本人撰写的文章

1
对于任何阅读此内容的人来说,这会让设计师感到高兴,但实际上你不应该这样做,因为它会为每个直接引用资源的控件实例化一个额外的资源文件副本。 - claudekennilol
问题是在设计时而不是运行时加载资源字典... :|(可能会被踩) - SiL3NC3
如果有人只需要在设计时使用ResourceDictionaries,请看这里:https://dennymichael.net/2016/07/28/wpf-design-time-resources-dictionary/ - 这对我很有帮助... ;))) 谢谢Denny Michael - SiL3NC3
@claudekennilol 我不能确认这一点。当我添加了“normal” ResourceDictionary 引用时,执行时间比没有引用慢了10倍。但是当我将 ContainsDesignTimeResources 设置为 true 时,对执行时间没有影响。我会继续使用这个设置。 - oleh
2
对于VS2019项目文件: <Page Update="Properties\DesignTimeResources.xaml"> <SubType>Designer</SubType> <ContainsDesignTimeResources>True</ContainsDesignTimeResources> </Page> - Morten Nilsen
如果您将DesignTimeResources.xaml粘贴到VS2019的Properties文件夹中,则ItemGroup会自动添加到.csproj文件中。 - Morten Nilsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接