2012-11-01 27 views
7

我把我的應用程序的資源在一個單獨的DLL和使用這樣的事情在App.xaml中引用它們在我的主EXE: -WPF在每個用戶控件中合併資源字典 - 壞主意?

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/MyThemesAssembly;component/Themes/Generic.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

當我編輯窗口,在主EXE項目,Visual Studio 2010的設計師無法識別來自其​​他程序集的任何資源,所以我沒有看到任何樣式應用(不是真正的問題,因爲我總是在XAML視圖中工作)。但是,Resharper不會識別這些外部資源名稱,因此在編輯XAML時會導致資源名稱下出現大量的錯誤。

我發現我可以通過在每個窗口和用戶控件中包含上面的XAML來修復VS設計器和Resharper,但是這會對內存和/或性能產生不利影響嗎?每個窗口會獲得資源的單獨副本嗎?

+0

那麼,IDE和工具中的錯誤不應該影響你的代碼。此外,在每一個控件中包含資源字典都是一種容易出錯的方式(如果您決定重命名字典以添加另一個字符,該怎麼辦?)。 – Vlad

+0

然而,我會嘗試在設計模式中添加一個解決問題的怪癖。 (也許這將有助於:'public class MyUserControlBase:UserControl {public MyUserControlBase(){if(DesignerProperties.GetIsInDesignMode(this))LoadExternalDictionariesExplicitlyHere(); ...') – Vlad

+1

@Vlad我已經學會了生活在一起的浪漫 - 這修復Resharper的方法實際上只是一個「很好有」。我不認爲重命名/添加資源會是一個問題 - 在我上面的XAML示例中,「Generic.xaml」本身只是合併了該程序集中的其他資源,因此很容易添加新資源。我更關心在每個窗口中包含是否會打擊應用程序(或VS2010)的內存/性能。 –

回答

2

嘗試使用VS2012。

我有我所用,我是做資源字典從外部組件,在我的App.xaml合併我有這樣的一個測試項目:

<Application x:Class="WpfPackDictionaries.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="pack://application:,,,/WPFCommonLibrary;component/Vectors/Vectors.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

然後在我的mainwindow.xaml我有這個在路徑的風格ModifiablePathStyle拉:

<Window xmlns:Control="clr-namespace:WPF.Common.Control;assembly=WPFCommonLibrary" x:Class="WpfPackDictionaries.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
     <Path Style="{StaticResource ModifiablePathStyle}" Fill="Red"/> 
     <Control:Jabberwocky /> 
    </Grid> 
</Window> 

智能感知/ ReSharper的(V7.1 10/31(早期訪問版本))識別的風格,我沒有squigglies:

enter image description here

因此,你有沒有試過在VS2012工作?

+0

我們最終會轉向VS2012,但仍然在等待來自管理的$$$! –

+0

@AndrewStephens所有最好的工作都是在管理層的尊重下完成的。 ;-) – OmegaMan

+0

@AndrewStephens爲您的xaml工作使用VS2012 Express版本。它仍然可以在不改變.prj或.sln項目的情況下編譯.Net 3.5/4.0項目。 – OmegaMan

3

我們在使用每個UserControl/View中引用的ResourceDictionaries的應用程序時遇到問題。我建議反對。通過使用SharedResourceDictionaries,我們設法減少了應用程序的內存佔用量,達到300 MB。我看起來好像你最終將爲應用程序中的每個UserControl實例化一次ResourceDictionary。不要這樣做只是爲了修復VS設計師。

2

VS2012能夠'看到'資源,因爲VS XAML設計器在設計時加載和執行代碼,因此VS可以檢查運行時可用的資源。 ReSharper從不使用設計時代碼執行(因爲這需要你的代碼始終處於可編譯狀態),所以XAML支持變得更復雜一點。

ReSharper 8.0實現了對BAML反編譯的支持,並提取了XAML文件列表並解析了引用二進制程序集中的XAML資源。

相關問題