2012-10-22 180 views
2
<Application x:Class="CustControls.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/ControlLibrary;component/Styles/ControlResource.xaml"/> 
      <ResourceDictionary Source="StringLocalization/Dictionary_fr-FR.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

如何動態更改wpf中的資源字典源名稱?

現在我想改變的ResourceDictionary的源名稱源= 「StringLocalization/Dictionary_fr-FR.xaml」到源= 「StringLocalization/Dictionary_en-US.xaml」

我應該做的爲了那個原因。

+0

爲什麼你想這樣做? – pdvries

+0

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/4ed27a95-bc48-4694-b5fb-66fdab8a79f3 – Klaus78

回答

4

MSDN-documentation解釋,

「在代碼中,您沒有設置源屬性。相反,你必須通過創建一個或加載一個獲得 ResourceDictionary中的對象。加載現有 方式ResourceDictionary在 上調用具有ResourceDictionary根的現有XAML文件流的XamlReader.Load,然後 將XamlReader.Load返回值轉換爲ResourceDictionary。「

看起來您只能通過創建一個或加載一個ResourceDictionary來獲得ResourceDictionary。

使用ResourceDictionaries理解您的目的也很重要。如果您打算將它們用作「共享資源」,則無法使用「嵌入式資源」操作構建字典。確保他們被標記爲「內容」並正確鏈接到他們的路徑位置。此外,它也很重要,要了解字典如何合併到這是選擇在其他(從MSDN-documentation拍攝)資源方面的行爲:

資源合併字典在資源 查找範圍是佔據一個位置就在他們被合併到主要資源 字典的範圍之後。儘管任何單個字典中的資源密鑰必須是唯一的,但密鑰可以在一組合並字典中存在多個 次。 在這種情況下, 返回的資源將來自最後一個在 MergedDictionaries集合中依次找到的字典。如果MergedDictionaries 集合是在XAML中定義的,則集合中合併的 字典的順序是標記中提供的元素的順序,如 。如果在主詞典 中以及在合併的詞典中定義了鍵,則返回的 的資源將來自主詞典。這些作用域規則 同樣適用於靜態資源引用和動態資源 引用。

看着你的代碼,看起來你只是想將另一個ResourceDictionary加載到你的應用程序中。如果這就是你想要的,那麼可能將它添加到MergedDictionaries集合中就足夠了。

如果你想在運行時加載一個,你可以使用下面的代碼(或類似的代碼)。只要確保你不嵌入您的資源:

try 
    { 
     string path = @".\Themes\Dictionary1.xaml"; 
     var xmlTextReader = new XmlTextReader(path); 
     var resourceDictionary = (ResourceDictionary)XamlReader.Load(xmlTextReader); 
     Application.Current.Resources.MergedDictionaries.Clear(); 
     Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); 
    } 
    catch (Exception exception) 
    { 
     Debug.WriteLine(exception.Message); 
    } 

這裏是萬一code你需要它。讓我知道這是否有幫助。