2010-09-16 119 views
10

考慮文件|爲什麼Generic.xaml中的合併字典需要絕對uri?

  1. 命名CustomControl1
  2. 名爲Dictionary1和Dictionary2
  3. 兩個新的資源字典新的自定義控制

就拿產生的樣式當中Generic.xaml和移動它:包含一個WPF應用程序的新項目到Dictionary2。然後合併成Dictionary2和Dictionary1到Dictionary1一般是這樣的:

<!--Generic.xaml--> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/Themes/Dictionary1.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

<!--Dictionary1.xaml--> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Dictionary2.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

然後,添加CustomControl1的實例到主窗口的網格。 (這個部分是重現問題所必需的,項目總是編譯得很好 - 只是在運行時纔會出現問題,並且必須參考字典。)

在Dictionary1.xaml中,我正在合併另一個字典文件夾,所以一個簡單的Source =「Dictionary2.xaml」就起作用。然而在Generic.xaml中,我必須使用絕對URI。如果我將上面的內容更改爲Source =「Dictionary1.xaml」,而沒有使用pack://應用程序東西,那麼當它嘗試構造MainWindow時,我得到由IOException導致的XamlParseException「Can not locate resource'dictionary1.xaml'」。

我的問題:關於相對URI解析的generic.xaml有什麼特別之處?爲什麼?

回答

0

只是猜測:generic.xaml也需要從外部程序集訪問,所以這是一種確保資源可以在任何地方使用絕對URI找到的方法。正如我所說,這只是在黑暗中刺,不知道。

10

對不起,因爲我沒有寫評論的能力,所以我發佈這個答案。

我有同樣的情況,一切工作正常。我不需要在Generic.xaml的路徑中放入「pack:// application」。但只有當程序集的輸出類型是「Windows應用程序」時。 對於「類庫」我需要將程序集名稱添加到路徑(Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml")因爲沒有它WPF引擎試圖在應用程序的主要程序集中查找Dictionary1.xaml。

這兩種情況下的目標框架都是「.NET Framework 4 Client Profile」