同一 ResourceDictionary 的多个实例

Kac*_*ski 5 c# wpf xaml resourcedictionary

我发现了这篇关于提高ResourceDictionaries网络性能的文章,但问题是它已经很旧了(2011 年)。我正在考虑实现这样的东西,但我想知道 Microsoft 是否没有在 .NET Framework 的最新版本中修复此问题。关于这个话题我有几个问题,希望这里有人能给出答案:

  1. .NET Framework 4.6.1 是否仍然ResourceDictionaries通过创建它们的多个实例(每次将它们分配给控件时一个实例)来进行管理?
  2. "CustomButtonStyle"例如,当我在ResourceDictionary名为 的"ButtonStyles"程序集中调用样式,然后在应用程序中"StylesAssembly"引用该样式,并为其分配了 20 个时,这甚至是一个问题吗?App.xamlButtonsCustomButtonStyle
  3. 我的理解是否正确,在上面的例子中,将会有 20 个实例"ButtonStyles" ResourceDictionary

Kac*_*ski 4

感谢@mm8 发布您的答案。这是100%正确的,我只想发布我自己的答案,因为我发现了一些有趣的东西,对其他人可能有用。

答案是:如果在应用程序中引用 ResourceDictionary 实例,则只会创建一次(无论许多控件使用其样式),但每次在应用程序中使用的另一个 ResourceDictionary 中引用它时,都会再次实例化它。


因此,为了给您提供这种情况的示例,假设我们有以下结构:

- StylesAssembly.dll
  - ButtonResourceDictionary.xaml
  - CustomButtonResourceDictionary.xaml

- Application.exe
  - App.xaml
  - MainWindow.xaml
Run Code Online (Sandbox Code Playgroud)

ButtonResourceDictionary.xaml有以下代码:

<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}">
    <!-- Some setters -->
</Style>
Run Code Online (Sandbox Code Playgroud)

CustomButtonResourceDictionary.xaml具有以下代码,其中使用ButtonResourceDictionary.xaml

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="ButtonResourceDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>

<Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource DefaultButtonStyle}">
    <!-- Some setters -->
</Style>
Run Code Online (Sandbox Code Playgroud)

Application.exe引用了App.xamlStylesAssembly.dll并有以下代码:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/StylesAssembly;component/ButtonResourceDictionary.xaml" />
            <ResourceDictionary Source="pack://application:,,,/StylesAssembly;component/CustomButtonResourceDictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

现在,如果我们的MainWindow.xaml中有类似的内容,则将ButtonResourceDictionary.xaml只有一个实例

<StackPanel>
    <Button Style="{StaticResource DefaultButtonStyle}" />
    <Button Style="{StaticResource DefaultButtonStyle}" />
    <Button Style="{StaticResource DefaultButtonStyle}" />
    <Button Style="{StaticResource DefaultButtonStyle}" />
    <Button Style="{StaticResource DefaultButtonStyle}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

但如果我们的MainWindow.xaml中有类似的内容,则将CustomButtonResourceDictionary.xaml有一个实例,但ButtonResourceDictionary.xaml将有两个实例

<StackPanel>
    <Button Style="{StaticResource DefaultButtonStyle}" />
    <Button Style="{StaticResource DefaultButtonStyle}" />
    <Button Style="{StaticResource CustomButtonStyle}" />
    <Button Style="{StaticResource CustomButtonStyle}" />
    <Button Style="{StaticResource CustomButtonStyle}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为前两个Buttons使用DefaultButtonStyle来自 的样式ButtonResourceDictionary.xaml,但另外三个Buttons使用CustomButtonStyle来自 的样式CustomButtonResourceDictionary.xaml,并合并ButtonResourceDictionary.xaml到其代码中。