WPF在每个用户控件中合并了资源字典 - 坏主意?

时间:2012-11-01 11:38:59

标签: wpf resharper

我将应用程序的资源保存在一个单独的DLL中,并在App.xaml中使用类似的东西在我的主EXE中引用它们: -

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

当我编辑主EXE项目中的窗口时,VS2010设计器无法识别来自其​​他程序集的任何资源,因此我没有看到任何样式应用(不是真正的问题,因为我总是在XAML中工作视图)。但是,Resharper也无法识别这些外部资源名称,因此在编辑XAML时会导致资源名称下出现大量的波形。

我发现我可以通过在每个窗口和用户控件中包含上述XAML来修复VS设计器和Resharper,但是这会对内存和/或性能产生负面影响吗?每个窗口都会获得一份资源的单独副本吗?

3 个答案:

答案 0 :(得分:3)

我们的应用程序中存在一个问题,即使用每个UserControl / View中引用的ResourceDictionaries。我建议反对。我们设法通过使用SharedResourceDictionaries将应用程序的内存占用量减少了300 MB。我看起来你最终将为应用程序中的每个UserControl实例化一次ResourceDictionary。不要只是修复VS设计师。

答案 1 :(得分: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>

Intellisense / Resharper(V7.1 10/31(早期访问构建))识别风格,我没有波浪形:

enter image description here

因此你试过在VS2012工作吗?

答案 2 :(得分:2)

VS2012能够“看到”资源,因为VS XAML设计人员在设计时加载并执行您的代码,因此VS可以检查运行时可用的资源。 ReSharper从不使用设计时代码执行(因为这需要您的代码始终处于可编译状态),因此XAML支持变得有点复杂。

ReSharper 8.0实现了对BAML反编译的支持,并且确实提取了XAML文件列表并从引用的二进制程序集中解析了XAML资源。