Wpf 如何将ResourceDictionary传递给ViewModelLocator
您好,我在ViewModelLocator中创建了一个属性,以允许ResourceDictionary传递给ViewModelLocator。在my app.xaml中,我定义了以下内容:Wpf 如何将ResourceDictionary传递给ViewModelLocator,wpf,mvvm-light,Wpf,Mvvm Light,您好,我在ViewModelLocator中创建了一个属性,以允许ResourceDictionary传递给ViewModelLocator。在my app.xaml中,我定义了以下内容: <vm:ViewModelLocator x:Key="Locator"> <vm:ViewModelLocator.DefaultUIResourceDictionary> <ResourceDictionary Source="Resources/DefaultU
<vm:ViewModelLocator x:Key="Locator">
<vm:ViewModelLocator.DefaultUIResourceDictionary>
<ResourceDictionary Source="Resources/DefaultUIResource.xaml"/>
</vm:ViewModelLocator.DefaultUIResourceDictionary>
</vm:ViewModelLocator>
它运行正常,但是,当我尝试引用字典时,字典中有0个项,我确信DefaultUIResource.xaml定义了一个项。不知道怎么了
另一个问题是,App.resources属性中定义的资源仅在引用时创建?有人能告诉我应用程序类的生命周期吗?资源属性中的项目何时创建?在构造函数之后?很奇怪,问题似乎是您的属性在初始化之前就通过了资源字典-如果您在
DefaultUIResourceDictionary
setter中查看字典的Source
属性,它将为空。但是试试这个:
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流加载资源字典。)但可以肯定的是,在通常的场景中,App
的Resources
属性中的字典,或者在编译的Xaml中的UI元素中,资源在您请求之前不会被加载
这实际上与App
类的生命周期无关。执行延迟加载的不是应用程序,而是资源字典本身。这是在每个资源的基础上完成的——在您第一次查找单个资源时就会加载它们。这意味着理论上可以在应用程序生命周期的任何时候加载资源。事实上,一些资源永远无法加载是很常见的
这加快了WPF应用程序的启动速度——如果您的所有资源都在启动时加载,那么所需的时间将远远超过必要的时间。假设您只有在错误情况下才使用资源,例如,您不想让用户在开始使用您的应用程序之前等待资源加载
因此,资源字典在编译的Xaml中有时表现得有点奇怪。你在这里发现的行为确实很奇怪。我不确定它是否真的是这样的-这可能只是由于资源字典作为特例处理以启用延迟加载而产生的一些意外后果。好的,我找到了一个解决方案:
我创建了另一个ResourceDictionary,并在其中定义如下:
<ResourceDictionary x:Key="Default" Source="/Resources/DefaultUIResource.xaml"/>
<vm:ViewModelLocator x:Key="Locator" DefaultUIResourceDictionary="{StaticResource Default}"/>
然后在App.Resources中,我只使用ResourceDictionary的合并词典链接到这个新的ResourceDictionary。谢谢您的解释。。无论如何,我只是设法找到了一个解决办法。不确定这样做是否正确。。。见新帖子