2011-04-22 93 views
7

如果我有這些詞典:的Silverlight 4 - 使用靜態資源從一個資源字典在其他

dict1.xaml: <Color x:Key="Color1">Red</Color>

dict2.xaml: <SolidColorBrush x:Key="Brush1" Color={StaticResource Color1} />

這工作:

App.xaml:

<MergedDictionaries> 
    <ResourceDictionary Source="dict1.xaml"/> 
<MergedDictionaries> 

SomePage.xaml:

<UserControl.Resources> 
    <MergedDictionaries> 
    <ResourceDictionary Source="dict2.xaml"/> 
    </MergedDictionaries> 
</UserControl.Resources> 

這不:

的App.xaml在應用程序級合併兩者。

我收到有關未找到Color1的錯誤。

這是爲什麼? /有沒有辦法解決它?我知道這個例子很簡單,但真正的例子太長了。基本上我只是想整理我的風格和模板在不同的文件:

  • 一個用於顏色
  • 一個隱式風格
  • 許多顯式風格

編輯:奇怪的是,如果我在代碼Application_Startup上設置了RootVisual屬性之前,我沒有收到錯誤...我只是爲什麼而感到困惑!

回答

5

不幸的是,你已經在Silverlight資源系統中遇到了一個惱人的限制,我只能想象它是一些優化問題。這裏似乎有一些異步行爲,MergedDictionaries中的每個字典都是並行加載的,因此當「dict2.xaml」加載時,不能依賴「dict1.xaml」存在的內容。

最簡單的解決方案是包括Dict1在Dict2合併: -

的App.xaml:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="dict2.xaml" /> 
<ResourceDictionary.MergedDictionaries> 

Dict2.xaml:

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="dict1.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
    .... <!-- dict2 resource --> 
</ResourceDictionary> 
+0

有沒有人得到這個在Windows 8/Metro工作? – Nilzor 2013-02-03 18:42:53

1

這將是App.xaml中

<Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="dict1.xaml" /> 
       <ResourceDictionary Source="dict2.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 

只要你定義在另一個之前,我與上述類似的是行不通的一個小驚喜的東西字典。

+0

我已經嘗試過,發佈本作之前那將是明顯的罪魁禍首。但是,沒有這樣的運氣。它似乎試圖同時解決,這只是對我的可笑氣憤,因爲我不能看到你想要這種行爲的一個案例,特別是如果MS不給我們'DynamicResource' – Kir 2011-04-22 19:20:10

+0

它可能會有所幫助你的app.xaml就像你失敗時所擁有的一樣。我自己做了這件事,看不到或想到我需要做的任何特殊工作 – tam 2011-04-22 19:24:09

+0

這就是我所有的應用程序xaml除了文件聲明(我沒有碰到的東西)之外。 當你說你已經做了這個,你有沒有字典,其中一個引用另一個定義的資源?因爲從字面上看,我已經在一個完全新的項目中轉載了這個項目,除了兩個字典,合併的字典和一個使用一個字典中的文本塊的頁面之外,沒有其他任何字符(儘管我認爲它沒有那麼遠) – Kir 2011-04-22 21:12:28

1

你可以做一個由@Anthony提出的方式,但這裏有一個警告 - 如果你在例如5個其他字典中使用你的第一個資源字典,那麼它將被加載5次,並且你將有6個相同資源字典的副本ary(這是在App.xaml中引用它的情況),這對性能不是很好。這可以使用Silverlight的資源字典的小類從這裏修復 - http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/

0

我和譚在這一個。 「合併資源字典集合中的資源查找邏輯處於最後,首先出現。」換句話說,如果你有多個字典引用另一個字典,那麼包含引用資源的字典必須位於堆棧的頂部。請確保您引用他們在正確的順序和小心,以確保在堆棧的頂部的字典對詞典不依賴於棧底

<Application.Resources>   
<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries>          
    <ResourceDictionary Source="Dict1.xaml" /> 
    <ResourceDictionary Source="dependsOnDict1.xaml" />     
    </ResourceDictionary.MergedDictionaries>   
</ResourceDictionary>  
</Application.Resources> 
+1

這不是展示的行爲。如果是這樣的話,那就沒有問題了,一年前我不會發布這個問題。試試看看:) – Kir 2012-02-29 15:31:35