从外部程序集编辑资源字典



我一直在寻找一个程序集是否有可能在运行时从另一个程序集更改ResourceDictionary值。到目前为止我什么也没找到。事情是这样的。我有一个UserControl,将独立工作,所以它可以适合不同的项目。我的UserControl有它自己的资源。xaml(编译为资源)。我有第二个程序集,它用作此用户控件的设置工具。它基本上只是读取UserControl资源。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>
    


是的,您可以在运行时更改资源的值。既然已经合并了字典,那么可以像这样更改值:

this.Resources["IsZoomable"]=false;

确保资源键与实际键匹配。
如果你已经在app.xaml中合并了字典,那么你可以使用:

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

最新更新