2015-08-21 48 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 。 –

相關問題