【问题标题】:Shared project with resource dictionary (xaml)与资源字典 (xaml) 共享项目
【发布时间】:2016-12-14 09:28:31
【问题描述】:

我正在寻找一种在项目之间共享ResourceDictionary 的方法。

向共享项目添加新项目不提供资源字典。它可以在其他(主)项目中创建并拖动。但是我无法将其构建选项更改为 Page:

想法是像这样加载资源字典

var dictionary = new ResourceDictionary();
dictionary.Source = new Uri("/WpfApplication91;component/Dictionary2.xaml", UriKind.Relative);

这显然是目前失败的

PresentationFramework.dll 中出现“System.IO.IOException”类型的异常,但未在用户代码中处理

附加信息:找不到资源“dictionary2.xaml”。

有什么想法吗?

【问题讨论】:

    标签: c# wpf xaml resourcedictionary shared-project


    【解决方案1】:

    可以手动编辑共享项目以设置资源字典的构建操作。

    共享项目由Project.shprojProject.projitems 文件组成,打开第二个并在那里找到字典:

    <ItemGroup>
      <None Include="$(MSBuildThisFileDirectory)Dictionary.xaml" />
    </ItemGroup>
    

    之后添加

    <ItemGroup>
      <Page Include="$(MSBuildThisFileDirectory)Dictionary.xaml">
        <Generator>MSBuild:Compile</Generator>
        <SubType>Designer</SubType>
      </Page>
    </ItemGroup>
    

    对于包含字典的 WPF 项目,这是从普通 csproj 复制/粘贴的内容。

    似乎可以工作,但在将项目加载到 Visual Studio 时,此构建操作不可见。将文件添加到共享项目不会影响此手动更改。

    现在我可以拥有包含资源字典的共享项目了,耶!

    资源字典可以合并到应用程序字典中,例如它是否位于项目的根目录中(在 xaml 设计器中用作静态/动态资源):

    <Application.Resources>
        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries>
                <!-- doesn't really exists in project -->
                <ResourceDictionary Source="Dictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    

    和/或手动加载,例如使用这个pack Uri

    var dictionary = new ResourceDictionary()
    {
         Source = new Uri("pack://application:,,,/FlexProperty.xaml"),
    };
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。有一种将 Xaml 包含在共享项目中的解决方案,不需要直接编辑 .projitems 文件。

      您只需将 Xamarin 添加到您的 Visual Studio 安装中。 (我是在 VS Community 2015 上做到的。)

      您现在可以通过通常的 Visual Studio 对话框添加 xaml 类型:

      并且可以使用正确的构建操作:

      共享项目中的 Xaml 现在可以按预期编译和运行。

      (大概这是为了支持Xamarin Forms,但它适用于任何xaml 文档。)

      【讨论】:

      • 我添加了一些截图。
      • 您在 UWP 解决方案中使用共享项目。它不能解决我的 WPF 解决方案问题。
      • 您可以将共享项目添加到您通常可以添加的任何项目中,包括 WPF 项目。
      • 当然,但是没有构建选项“页面”,请查看有问题的屏幕截图,这是我的问题。
      • 是的,如果您安装 Xamarin,就会有。请参阅 我的 屏幕截图。我刚刚尝试将共享项目添加到 WPF 项目中,它可以工作。
      【解决方案3】:

      这个问题是您正在输入应用程序名称。您需要项目名称。以下是如何在 XAML 和代码中执行此操作

      <UserControl.Resources>
          <ResourceDictionary>
              <ResourceDictionary.MergedDictionaries>
                  <ResourceDictionary Source="/SharedProject1;Component/Dictionary2.xaml" />
              </ResourceDictionary.MergedDictionaries>
          </ResourceDictionary>
      </UserControl.Resources>
      

      或者

      var dictionary = new ResourceDictionary();
      dictionary.Source = new Uri("/SharedProject1;component/Dictionary2.xaml", UriKind.Relative);
      

      【讨论】:

      • 不,应用程序名称应该可以正常工作。用Dictionary1.xaml 替换Dictionary2.xaml 将使我的代码正常工作,但我的目标是在共享项目中定位字典。您的更改应该会有所不同,因为构建操作仍然是None。您可以创建相同的项目结构(wpf解决方案,添加共享项目,添加资源字典,将其移至共享项目)并将代码放入主窗口构造函数中,您自己看看。
      • 你试过我的回答了吗?因为你的none shared project也是Application的名字。
      • “你没有共享的项目也是应用程序的名称” - 我不明白这一点。没有必要尝试任何东西,只要构建操作仍然None,它就不会起作用。
      • 在你分享的截图中,有2个项目,一个共享一个不共享。您突出显示的声明引用了未共享的项目。它与您的解决方案同名。因此,即使您正在输入解决方案名称,它也可能只查看同名项目。这也可以解释为什么用 Dictionary1.xaml 替换 Dictionary2.xaml 会起作用
      • 我明白你的意思。我的问题不是真的,而是构建操作。我提供了使用示例来表明我的意图,以防有人问:“你为什么要这个?” - “要在任何其他解决方案中像这样使用它,什么将使用这个共享项目和这个代码”。
      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多