【问题标题】:WPF Centralize xaml/image Resources in Multi-Tier/Project Application SolutionWPF 在多层/项目应用解决方案中集中 xaml/image 资源
【发布时间】:2012-11-19 20:22:00
【问题描述】:

我的情况是这样的。 我在 WPF 解决方案下有多个项目,这些项目组成了我正在开发的多层应用程序。由于单独的项目有时需要访问相同的图像或 xaml 资源,我想将“公共”资源集中到一个项目中,该项目可以被需要这些“公共”资源的任何其他项目引用。例如,我有一个 BMP 图像,我在不同项目中的各种控件和窗口中使用它作为横幅/徽标。似乎我应该能够将此图像作为资源添加到公共资源项目中,并从我的其他项目中引用它,而不是将图像单独添加到需要它的每个项目中。如果这是可能的,它会是什么样子,我应该怎么做?如果我的想法很糟糕,我愿意接受建议,但项目将会非常大,所以我不想到处添加资源。

谢谢!

附: 我已经对这个主题进行了相当多的搜索,但是那里有很多不知道自己在做什么的人提供的垃圾答案。鉴于我对 WPF 比较陌生,我宁愿直接回答我的问题。

【问题讨论】:

    标签: wpf xaml mvvm user-controls resourcedictionary


    【解决方案1】:

    经过一些修补和研究,我找到了解决我自己问题的方法。似乎我的答案的零碎散布在整个网络上,所以我将尝试在一个地方一次解释整个事情。回顾一下,我基本上想在我的解决方案中集中跨项目使用的任何资源。这些是我最终完成此任务所遵循的步骤。

    1。 在您的解决方案中创建一个用户控制项目(任何可以托管资源字典的项目都可以)。我将把这个项目称为“资源项目”。

    2。 将要在项目之间共享的任何资源文件(图像等)添加到资源项目。我尝试在有意义的子目录中组织文件。您需要将构建操作设置为“资源”,以便将其编译到输出二进制文件中。

    3。 现在将资源字典添加到资源项目。就我而言,我想引用几张图片,所以我制作了一张名为“ImageDictionary.xaml”的图片。

    4。 在资源字典中添加对图像文件的引用。我在这里引用图像,但它只是一个资源字典,你可以在那里放任何东西。中间的字符串就是你引用的图片文件的相对路径。

    <ImageSource x:Key="SomeImageKey"> 
        Images/SomeImage.bmp
    </ImageSource>
    

    5。 现在转到一个需要您刚刚在步骤 4 中创建的资源字典的项目。它可以是另一个用户控件或窗口,等等。右键单击项目引用并添加对资源项目的引用。

    6。 好的,现在当前项目需要引用您在步骤 4 中创建的在资源项目中定义的字典。我首先制作了一个用户控件,所以这就是我的代码如下所示...请注意,我使用了合并字典。我计划稍后使用更多,所以我选择了这种方式而不是单个字典。 下面的“ResourceProject”是您添加资源的项目/程序集的名称。 "component" 是一个关键字,需要在那里,后面是字典 xaml 代码文件的路径。

    <UserControl.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>        
        </UserControl.Resources>
    

    如您所见,引用外部资源字典需要一个称为“Pack URI”的东西。我找到了一种简便的方法。很长的路有点丑,据我所知,它没有任何优势。但这就是漫长的道路。

    <UserControl.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>        
        </UserControl.Resources>
    

    7。 现在您的当前项目已经引用了资源项目中的资源字典,您可以使用该字典中的任何内容。我继续在我的用户控件中放置一个图像。下面是代码。就像在本地引用字典一样。

    <Image Source="{StaticResource SomeImageKey}" />
    

    8。 重要的提示! 在我发现它之前,这让我头疼了一会儿。确保解决方案中的启动项目具有对资源项目的引用,即使启动项目不使用资源项目。 (即右键单击引用,添加引用等...) 除非您这样做,否则资源不会被编译到输出中。这部分很棘手,因为设计师甚至显示了我的图像并且我没有 xaml 错误,但在运行时它会抛出 set 属性并且找不到文件异常。当我从我的启动项目中引用我的资源项目时,这种情况就消失了。

    希望这对某人有所帮助。 下面是几个地方的链接(包括stackoverflow),它们给了我将所有部分放在一起所需的东西。

    http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-consuming-resource-dictionaries-in-wpf-and-silverlight.aspx

    Load WPF styles or other Static Resources from an external file or assembly

    ResourceDictionary in a separate assembly

    【讨论】:

    • 那里有很好的研究。正是我需要的 +1。
    • 非常感谢,我之前无法让它工作,因为我错过了第 8 步 :(。但现在它工作了,太棒了 :)
    • 我可以在资源字典中添加 吗?
    • 是的;有几种方法可以做到这一点。这是另一个问题,讨论了实现它的几种方法。 stackoverflow.com/questions/5661127/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多