首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向ViewModelLocator传递ResourceDictionary

如何向ViewModelLocator传递ResourceDictionary
EN

Stack Overflow用户
提问于 2010-11-30 16:16:11
回答 2查看 850关注 0票数 1

您好,我在ViewModelLocator中创建了一个属性,允许将ResourceDictionary传递给ViewModelLocator。在我的app.xaml中,我定义了:

代码语言:javascript
复制
<vm:ViewModelLocator x:Key="Locator">
  <vm:ViewModelLocator.DefaultUIResourceDictionary>
    <ResourceDictionary Source="Resources/DefaultUIResource.xaml"/>
  </vm:ViewModelLocator.DefaultUIResourceDictionary>
</vm:ViewModelLocator>

它运行得很好,但是,当我尝试引用字典时,它有0个条目,我确信DefaultUIResource.xaml已经定义了一个条目。不确定出了什么问题。

另一个问题是,在App.Resources属性中定义的资源仅在被引用时创建?有人能告诉我App类的生命周期吗?Resources属性中的项是何时创建的?在构造函数之后?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-30 18:52:01

好的,我找到了一个解决方案:

我创建了另一个ResourceDictionary,并在其中定义如下:

代码语言:javascript
复制
<ResourceDictionary x:Key="Default" Source="/Resources/DefaultUIResource.xaml"/>

<vm:ViewModelLocator x:Key="Locator" DefaultUIResourceDictionary="{StaticResource Default}"/>

然后在App.Resources中,我只需使用ResourceDictionary的MergedDictionaries来链接到这个新的ResourceDictionary。

票数 1
EN

Stack Overflow用户

发布于 2010-11-30 18:15:02

相当奇怪的是,问题似乎是在初始化之前将资源字典传递给您的属性-如果您在DefaultUIResourceDictionary设置程序中查看字典的Source属性,它将为空。但是试试这个:

代码语言:javascript
复制
private ResourceDictionary _defaultUIResourceDictionary;

public ResourceDictionary DefaultUIResourceDictionary
{
    get { return _defaultUIResourceDictionary; }
    set
    {
        _defaultUIResourceDictionary = value;
        Debug.WriteLine(value.Count);
        Dispatcher.CurrentDispatcher.BeginInvoke((Action) delegate
        {
            Debug.WriteLine(value.Count);
            foreach (var item in value)
            {
                Debug.WriteLine(item);
            }
        },
        DispatcherPriority.Background,
        null);
    }
}

您会发现第一个Debug.WriteLine显示的计数为0-与您看到的行为相同。但是在dispatcher回调中,计数现在应该是正确的,并且字典的内容是可用的。(这就是我在尝试的时候看到的。)

这可能与您的其他问题有关,也可能与您的其他问题无关,即资源实际创建的时间。资源字典通常在WPF中执行延迟的资源加载。我之所以说“典型”,是因为在某些情况下它们不是这样的(例如,如果您从未编译的Xaml流中加载资源字典)。但可以肯定的是,在通常的场景中-字典在AppResources属性中,或者在已编译的Xaml中的UI元素中-资源只有在您请求它们时才会被加载。

这实际上与App类的生命周期没有任何关系。执行延迟加载的不是应用程序,而是资源字典本身。它是在每个资源的基础上完成的-单个资源在您第一次查找它们时加载。这意味着理论上可以在应用程序生命周期的任何时间点加载资源。实际上,一些资源永远不会被加载是很常见的。

这加快了WPF应用程序的启动速度--如果你所有的资源都在一开始就加载了,那么它所花费的时间就会比必要的长得多。假设你的资源只在错误情况下使用,例如,你不想让用户在开始使用你的应用程序之前等待这些资源加载。

因此,资源字典在编译后的Xaml中有时表现得有点奇怪。你在这里发现的行为绝对是奇怪的。我不确定它实际上是这样的--它可能只是资源字典被作为特殊情况处理以启用延迟加载这一事实的一些意想不到的后果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4311742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档