【问题标题】:Cannot access resource defined in app.xaml无法访问 app.xaml 中定义的资源
【发布时间】:2010-03-21 14:05:18
【问题描述】:

我正在使用 Visual Studio 2010 RC1。

我在 app.xaml_ 中定义了一个资源“Brush2”:

<Application x:Class="VideoThumbnails.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>

        <RadialGradientBrush x:Key="Brush2" RadiusX="1" RadiusY="1" GradientOrigin="0.3,0.3">
            <GradientStop Color="White" Offset="0"/>
            <GradientStop Color="#ffc0c0" Offset="1"/>
        </RadialGradientBrush>

    </Application.Resources>
</Application>

在我的主窗口中,我正在尝试使用该资源:

...
<Border Margin="4,2" BorderBrush="Black" BorderThickness="2" CornerRadius="4"
        ToolTip="{Binding Path=FullPath}" HorizontalAlignment="Stretch"
        Background="{StaticResource Brush2}">
...

无论我做什么,它总是在运行时引发异常(找不到资源)。我变了 建立行动没有成功。

如何使用 app.xaml 中定义的资源?

【问题讨论】:

    标签: wpf xaml resources


    【解决方案1】:

    如果您已将 Startup Object 设置为自定义类,则需要创建自定义 Application 类并调用其 InitializeComponent 方法,如下所示:

    App app = new App();
    app.InitializeComponent();
    

    更新:正如@qqww2 建议的那样,InitializeComponent 调用可以移动到App 类构造函数中。

    【讨论】:

    • 或者,更好的是,将InitializeComponent(); 方法添加到App 类的构造函数中。创建对象后无需记住函数调用。
    • 你是对的,这就是我在某个时候开始使用它的方式。但我忘了更新这个答案。感谢您指出这一点!
    • 这正是我需要找到的。
    【解决方案2】:

    您所做的一切都不正确。您要么 1) 以某种方式搞砸了项目构建,同时随机做一些事情以使其工作,或者 2) 这里发生了其他事情,如果没有异常细节,我们永远不会知道。

    我强烈建议您尝试在一个全新的 WPF 项目中重现这一点。执行以下步骤(并且仅执行以下步骤):

    创建一个新的 WPF 项目,将完全相同的画笔添加到 app.xaml,然后打开 Window1 并将窗口的背景绑定到资源。运行应用程序。

    它应该按预期工作。如果没有,请返回异常详细信息。如果确实如此,请将这个新项目与您当前的项目进行比较,看看您在做什么不同。

    【讨论】:

    • 感谢您的建议,它终于可以工作了。我将项目属性中的启动对象显式设置为我自己定义的某个类。我将其更改为“(未设置)”并且它有效。多么奇怪……
    • 这实际上是有道理的。 Not Set 将导致 App.xaml 被解释为确定启动时要做什么。将其设置为您自己的类将导致这种情况不会发生,除非您明确地这样做。
    • @DerKlaus - 感谢您的评论!我将 App.xaml 的构建操作设置为 Page,以便我可以创建自己的入口点。 (这当然导致我在设计时加载样式时丢失了我的共享资源字典)。在阅读您的评论之前,我不知道我可以在项目属性中设置启动对象。这允许我将 App.xaml 的构建操作设置回应用程序定义!再次感谢!
    • 我现在也在这里。在一个新项目中工作,但不在我需要的地方。我看不出有什么不同。我现在可以在哪里搜索?我已经尝试了此页面上提到的所有内容。 - 哦,VS 设计师做对了,找到并应用了样式,但不是在运行时。
    • 作为其他人的注释(我知道这个线程很旧):我也遇到了同样的问题。我的应用程序启动得很好,但无法使用 App-resources。经过一些调查(与新项目相比),我意识到了这些差异: 1. App.cs 中的静态 main 方法,这绝对不是必需的 | 2. 删除它会导致它错过条目的静态 main 方法 | 3. 缺少x:Class="Project.App"。最后一个固定第二个,因此所有问题。现在我可以像往常一样使用我的资源了。 Main 中的自定义内容现在位于 OnStartup / Startup 重载/处理程序中。
    【解决方案3】:

    我以App.xaml 中的StartupUri 开始我的应用程序不是,而是在App.xaml.cs 中使用事件处理程序。

    当使用来自 App.xaml 的 override Startup() 资源时,未加载:

    public partial class App
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            ...
        }
    }
    

    但是当使用事件Startup 时,资源加载得很好:

    <Application x:Class="OxyplotTest.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 Startup="OnStartup">
    

    以及后面的代码:

    public partial class App
    {
        private void OnStartup(object sender, StartupEventArgs e)
        {
            ...
        }
    }
    

    【讨论】:

      【解决方案4】:

      我知道有一个已经被接受的答案,但我想我也会添加我的解决方案。我的代码可以正常工作,但是一些配置更改破坏了设计器中的资源引用。在执行代码时,它运行良好。

      经过一些初步研究,我确定应将 App.xaml 的 BuildAction 属性设置为 ApplicationDefinition。我的设置为 Page。但是,这会导致多个入口点出现一些问题。 Main() 已在 App.xaml.cs 中定义。编译错误表明 App.g.cs 中的另一个入口点(这是一个自动生成的文件)。

      我最终使用了http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html 中描述的方法#3。基本思想是创建一个只负责启动的新类。就我而言,我将其命名为 Startup.cs。它应该有类似这样的代码:

      using System.Threading;
      
      namespace MyNamespace
      {
          public class Startup
          {
              [System.STAThreadAttribute()]
              private static void Main()
              {   
                  var app = new App();
                  app.InitializeComponent();
                  app.Run();
              }
          }
      }
      

      然后在项目设置中,更改 Application -> Startup 对象,以便选择您的新类。

      【讨论】:

        【解决方案5】:

        我有一个类似的问题并解决了它,所以我想我也可以发布我的解决方案。如上所述,我只在运行时不断收到Resource not found 错误。在我的 Windows 8.1 c# 应用程序中,我使用了我定义的样式,它在 Blend 和设计器视图中显示良好,但在运行时不起作用。我试图在 these instructions 之后创建的 SettingsFlyout 中使用这种风格。让它工作后,我在 App.xaml 中设置了一个字段来保存我的弹出窗口(首选项和颜色设置),这样我就不会每次都创建一个新的。

        public static Preferences preferences;
        public static ColorSettings colorsettings;
        
        public App()
        {
            this.InitializeComponent();
            this.Suspending += OnSuspending;
            preferences = new Preferences();
            colorsettings = new ColorSettings();
        }
        

        在四处搜索和谷歌搜索大约一个小时后,我发现我创建浮出控件的时间太早了,并且在创建它们时它们无法访问应用程序的资源。所以我把他们的创作移到了App.OnLaunched(),这就解决了问题。

        我不确定这是否是处理事情的最佳方式,但它确实有效。因此,请尝试确定您尝试访问所需资源的位置,以及您是否尝试过早。抱歉含糊不清,可能不正确,我真的是 WPF 新手。

        【讨论】:

          【解决方案6】:

          我同意如果您在 App 构造函数中有某些内容,资源很容易被弄乱。将您自己的全局对象的初始化移到 OnStartup 方法中:

          protected override void OnStartup(StartupEventArgs e)
          {
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多