2015-08-21 50 views
1

我一直在搜索程序集是否有可能在运行时从另一个程序集更改ResourceDictionary值。到目前为止,我一无所获。 这里的交易。我有一个独立工作的UserControl,因此它可以适合不同的项目。我的UserControl有自己的Resources.xaml(编译为资源)。 我有第二个程序集,它用作此用户控件的设置工具。它基本上只读取UserControl Resources.xaml(这很好用),然后替换Resources.Xaml的值。麻烦的是,我无法更改资源值。从外部程序集编辑ResourceDictionary

下面是我用我的设置工具来读取资源字典代码:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Control;component/Configuration/Resources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    </Window.Resources> 

要改变这种价值观,我想是这样:

this.Resources.MergedDictionaries.First()["IsZoomable"] = false; 

它认识到资源,但不会改变它。是否有可能在运行时更改另一个程序集字典的值,或者是否需要创建可由两个程序集共享的外部字典?

编辑:

  • 用户控件包含Resources.xaml。我定义的资源,这种控制是这样的:

    <UserControl.Resources> 
    <ResourceDictionary Source="Configuration/Resources.xaml"/> 
    </UserControl.Resources> 
    
  • 设置工具可接取这个资源,但我不能改变他们。当我这样做时,用户控件仍然读取旧值。资源在设置工具定义的,像这样:

    <Window.Resources> 
        <ResourceDictionary Source="pack://application:,,,/Control;component/Configuration/Resources.xaml"/> 
    </Window.Resources> 
    
+1

当你说“不会改变”,你的意思是它抛出一个错误,或者只是从来没有表现的变化?如果它抛出,那么你的资源可能被冻结,如果它没有显示,那么使用DynamicResource而不是StaticResource。 – GazTheDestroyer

+0

嗨。感谢您的评论。没有错误被抛出。这些变化从未表现出来。让我试试DynamicResource。 –

回答

1


是的,你可以在运行时改变资源的价值。 既然你已经合并的字典,你可以更改值这样的:

this.Resources["IsZoomable"]=false; 

确保关键资源的实际密钥相匹配。
如果你已经合并在App.xaml中的字典,那么你可以使用:

Application.current.Resources["IsZoomable"]=false; 
+0

我已经这样做了,仍然没有变化。在设置工具中,我更改了ResourceDictionary上的一些值。我再次加载UC并且值与以前相同。我将在每个项目中使用我的资源的定义编辑帖子。 –

+1

我相信你应该检查你是否在为usercontrol定义的样式中使用静态/动态资源。因为如果您将它作为StaticResouce使用,即使该值在后台更改,也不会为usercontrol更新。​​因此,在这种情况下,您可以将其用作DynamicResource,以便将更改后的值反映到usercontrol 。 –

相关问题