9

为了优化我的应用程序,我创建了一个 SharedResourceDictionary。有了这个,我在运行时节省了大约 250 mb 的内存,所以效果很好。

我的问题是在设计时,在 Blend 4 中,我无法再访问我的资源。要修改模板(witch 在我的资源文件中),我通常右键单击我的控件,然后选择 Edit Template --> Edit Current,如下图所示:

在此处输入图像描述

我需要以这种方式修改我的模板,它比进入我的资源文件并找到好的模板要快 100 倍......我有很多资源......

我的 SharedResourceDictionary 是这样实现的(在网上找到):

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
        {
            if (IsInDesignMode)
                return base.Source;

            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]);
            }
        }
    }

    /// <summary>
    /// Check if we are in Blend to prevent error
    /// </summary>
    public bool IsInDesignMode
    {
        get
        {
            return
            (bool)
            DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty,
            typeof(DependencyObject)).Metadata.DefaultValue;
        }
    }
}

有人知道是否有解决方案?由于内存改进,我真的想保留这个共享字典,但我也想轻松修改我的资源......

任何线索将不胜感激。谢谢你。

编辑:

这样做(SharedResourceDictionary),我也有静态资源的问题:

Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.

当我将它们更改为动态资源时,它可以工作,或者如果我通过简单的 ResourceDictionary 更改 SharedResourceDictionary 它也可以工作。该项目可以编译,但正如我所说,我无法在没有修改的情况下编辑资源。

4

2 回答 2

1

您正在为 .NET 4 进行编译吗?

您可能遇到了无法正确扫描 ResourceDictionaries 的错误。

有人说您必须在 App.xaml 级别(在 Application.Resources 中)添加您的 ResourceDictionaries,并添加一个虚拟的默认样式。

这可能对您不起作用,因为您似乎在控制中添加资源。

http://blogs.windowsclient.net/rob_relyea/archive/2010/04/26/my-staticresource-reference-worked-differently-with-wpf-4-rc-than-it-does-with-wpf-4- rtm.aspx

将合并词典添加到合并词典

引用包含合并字典的资源字典时遇到问题

http://connect.microsoft.com/VisualStudio/feedback/details/553528/defaultstylekey-style-not-found-in-inner-mergeddictionaries

于 2012-07-10T11:22:38.660 回答
0

实际上,使用此功能是有问题的。=(

也许将来事情会变得更好,不知道是否会有所帮助,但您可以尝试不同的实现: WPF SharedResourceDictionary (但不保证它会起作用)

由于设计时出现问题,我放弃了使用 SharedResourceDictionary,只有当项目 100% 完成时,我才会重新使用。

于 2012-07-07T02:57:29.790 回答