WPF - 在App.xaml的Build Action = Page时,在设计时访问资源

Gus*_*nti 7 wpf resources

我将App.xaml的构建操作更改为"页面",因此我可以处理启动画面并确保我的应用程序仅作为单个实例运行(具有我自己的入口点).它在运行时工作正常,但在设计时,应用程序无法再查看我的资源.资源位于同一项目中的单独xaml文件中.如何让我的应用再次在设计时看到资源?

谢谢

Rob*_*son 6

将您的资源分解为一个单独的资源字典,然后将它们拉入App.xaml,如下所示:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MasterResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

您可以根据需要以这种方式添加多个资源字典.

您还需要在UserControls(以及使用资源引用UserControls的Windows)中执行相同的操作:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="MasterResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

有关此主题的更多信息,请参见http://ithoughthecamewithyou.com/post/Merging-Resource-Dictionaries-for-fun-and-profit.aspx.

  • 当我使用这种方法时,我最终得到了MasterResources.xaml中为每个合并它们的UserControl定义的资源的单独副本,这导致内存可怕. (7认同)
  • 究竟.UI组件之间的共享或图形资源和样式是编写WPF UI的一个关键方面,但在设计模式下似乎根本没有任何支持,并且MS建议只在您使用的任何地方复制资源他们显然是胡说八道. (2认同)

Dan*_*oft 0

如果我理解正确,您正在 app.xaml 中加载应用程序范围的资源吗?在这种情况下你可以这样做:


App app = new App();
//Get assembly name is your own method
string assemblyName = GetAssemblyName(Assembly.GetExecutingAssembly());

Uri resourceLocater = new Uri("/" + assemblyName + ";component/app.xaml", UriKind.Relative);
System.Windows.Application.LoadComponent(app, resourceLocater);
MainWindow mainWindow = new MainWindow();
app.Run(mainWindow);
Run Code Online (Sandbox Code Playgroud)

然后你的资源就会被加载

/丹尼尔

  • 最初的问题说该问题仅发生在设计时。在我看来,上面的代码在设计时不会产生任何影响。我缺少什么?(我有同样的问题:它在运行时工作正常,但在设计时出现“StaticResource引用...未找到错误”) (7认同)