2010-03-21 49 views
8

我正在使用Visual Studio 2010 RC1。无法访问app.xaml中定义的资源

我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中定义的资源?

回答

4

你所做的一切都不正确。你可能有1)以某种方式搞砸了项目构建,而是随机做了一些事情来试图让它工作,或者2)其他事情正在发生,我们永远不会知道没有例外的细节。

我强烈建议您尝试在新的全新WPF项目中重新制作此代码。执行以下步骤(并且仅执行以下步骤):

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

它应该按预期工作。如果不是,则返回异常详细信息。如果确实如此,请将这个新项目与您当前的项目进行比较,以查看您所做的改变。

+1

感谢您的建议,它终于有效。我明确地将项目属性中的启动对象设置为我自己定义的某个类。我将其改为“(未设置)”,它起作用。多么奇怪...... – DerKlaus 2010-03-21 15:33:56

+0

这实际上是有道理的。未设置将导致App.xaml被解释为找出在启动时要做什么。将它设置为你自己的类将导致这种情况不会发生,除非你明确做到了。 – 2010-03-21 15:39:46

+1

@DerKlaus - 感谢您的评论!我将App.xaml的构建操作设置为Page,这样我就可以创建自己的入口点。 (这当然会导致我在设计时从加载样式中丢失我的共享资源字典)。我不知道在读取评论之前,我可以在项目属性中设置启动对象。这使我可以将App.xaml的构建操作设置回应用程序定义!再次感谢! – Scott 2010-05-27 20:21:07

16

如果您已设置启动对象为自定义类,你需要创建自定义的应用程序类,并调用它的InitializeComponent方法,像这样:

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

更新:由于@ qqww2建议InitializeComponent通话可以在App类构造函数中移动。

+1

或者,更好的方法是将'InitializeComponent();'方法添加到App类的构造函数中。创建对象后不需要记住函数调用。 – 2016-01-20 15:05:42

+0

你是对的,这就是我在某个时候开始使用它的原因。但我忘了更新这个答案。感谢您指出这一点! – ceco 2016-01-20 16:43:06

+0

这正是我需要找到的。 – sidbushes 2016-11-21 15:57:14

3

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

经过一些初步研究,我确定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(); 
     } 
    } 
} 

然后在项目设置,更改应用程序 - >启动对象,以便选择新类。

3

我有一个类似的问题,并解决了它,所以我想我不妨发布我的解决方案。如上所述,我一直只在运行时遇到Resource not found错误。在我的Windows 8.1 c#App中,我使用了我定义的样式,并且在Blend和设计器视图中显示得很好,但在运行时无法使用。我试图在我创建了以下these instructions的SettingsFlyout中使用此样式。在开始工作之后,我在App.xaml中设置了一个字段来保存我的弹出窗口(Preferences和ColorSettings),这样我就不会每次都创建一个新窗口。

public static Preferences preferences; 
public static ColorSettings colorsettings; 

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

闲逛和谷歌上搜索了大约一个小时后,我想通了,我太早期创建弹出按钮,并创建它们时,他们无法访问应用程序的资源。所以我把他们的创作转移到了App.OnLaunched(),并解决了这个问题。

我不确定这是否是最好的方法去处理事情,但它的工作。因此,试着找出你想要访问你想要的资源的位置,如果你想尝试得太早。抱歉,模糊不清,也许不正确,我对WPF很陌生。

3

我可以认为,如果你在App构造函数中有某些东西,资源会很容易混乱。将自己的全局对象的初始化移动到OnStartup方法中:

protected override void OnStartup(StartupEventArgs e) 
{ 
}