7

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

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

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

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

4

3 回答 3

3

我们的应用程序在使用每个 UserControl / View 中引用的 ResourceDictionaries 时遇到了问题。我不建议这样做。通过使用 SharedResourceDictionaries,我们设法将应用程序的内存占用减少了 300 mb。我看起来您最终会为应用程序中的每个 UserControl 实例化一次 ResourceDictionary。不要仅仅为了修复 VS 设计器而这样做。

于 2012-11-01T15:16:16.813 回答
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 (Early Access Build)) 可以识别这种风格并且我没有波浪线:

在此处输入图像描述

因此,您是否尝试过在 VS2012 中工作?

于 2012-11-01T13:36:02.247 回答
2

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

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

于 2012-11-02T15:06:09.903 回答