gpt4 book ai didi

wpf - 将词典合并到多个用户控件中——这会影响内存吗?

转载 作者:行者123 更新时间:2023-12-04 20:25:25 25 4
gpt4 key购买 nike

我有一个包含(到目前为止)18 个 XAML 资源的 UI 项目,它们像这样合并到 App.xaml 中:-

<Application ...>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/foo.Client.Common;component/UIStyles/Colours.xaml" />
<ResourceDictionary Source="pack://application:,,,/foo.Client.Common;component/UIStyles/Buttons.xaml" />
<ResourceDictionary Source="pack://application:,,,/foo.Client.Common;component/UIStyles/Menus.xaml" />
// etc..
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

当我编辑此项目中的任何 XAML View 时,我会获得这些资源中包含的样式名称的智能感知 (Resharper)。

现在,该应用程序还实现了“插件”架构,并且有几个包含 View 和 View 模型的类库项目;这些在运行时动态加载。尽管应用程序运行良好,但在这些项目中编辑 XAML View 时,我没有获得样式名称智能感知。我可以通过将必要的样式合并到 View 的 XAML 中来使智能感知工作,例如:-

<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/foo.Client.Common;component/UIStyles/Buttons.xaml" />
//etc..
</ResourceDictionary.MergedDictionaries>

// User control-specific styles go here.
</ResourceDictionary>
</UserControl.Resources>

通过在每个用户控件中执行此操作,我是否“复制”了每个资源并因此增加了应用程序的内存需求?如果是这样,有什么办法可以解决吗?如果我在类库中创建一个资源文件,将 15 个“核心”资源合并到其中,然后将这个资源合并到我的 View 中,会怎样?它还会导致同样的问题吗?

如果做不到这一点,我想我将不得不在每个 View 中将“合并 XAML”注释掉,并仅在我需要处理 View 时才暂时恢复它。

最佳答案

好问题。我有同样的问题。

这里基本上有两个问题:

1) Xaml 代码中烦人的重复 - 我不是在谈论实际资源的重复 - 相反,您必须编写 <ResourceDictionary>无处不在。

2) 资源的实际重复 - 浪费资源,另外:如果样式没有放在同一个地方,您将失去在运行时交换样式的好处。

如何解决这些问题?

通过创建新的 xaml 文件,调用它 SharedResourceDictionary.xaml ,其中包括所有资源。这将包含在 App.xaml 中.

这基本上允许您拉取 ResourceDictionary在其他 xaml 组件中,简而言之,只需包含 SharedResourceDictionary.xaml .

第二个技巧是确保资源只创建一次:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", 
"WPFTutorial.Utils")]

/// <summary>
/// The shared resource dictionary is a specialized resource dictionary
/// that loads it content only once. If a second instance with the same source
/// is created, it only merges the resources from the cache.
/// </summary>
public class SharedResourceDictionary : ResourceDictionary
{
/// <summary>
/// Internal cache of loaded dictionaries
/// </summary>
public static Dictionary<Uri, ResourceDictionary> _sharedDictionaries =
new Dictionary<Uri, ResourceDictionary>();

/// <summary>
/// Local member of the source uri
/// </summary>
private Uri _sourceUri;

/// <summary>
/// Gets or sets the uniform resource identifier (URI) to load resources from.
/// </summary>
public new Uri Source
{
get { return _sourceUri; }
set
{
_sourceUri = value;

if (!_sharedDictionaries.ContainsKey(value))
{
// If the dictionary is not yet loaded, load it by setting
// the source of the base class
base.Source = value;

// add it to the cache
_sharedDictionaries.Add(value, this);
}
else
{
// If the dictionary is already loaded, get it from the cache
MergedDictionaries.Add(_sharedDictionaries[value]);
}
}
}
}

如果这不起作用,下面有一些评论:http://www.wpftutorial.net/MergedDictionaryPerformance.html

还可以探索 xaml ifdef 代码领域:

Does XAML have a conditional compiler directive for debug mode?

关于wpf - 将词典合并到多个用户控件中——这会影响内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com