无法访问app.xaml中定义的资源
我正在使用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中定义的资源?
你所做的一切都不正确。你可能有1)以某种方式搞砸了项目构建,而是随机做了一些事情来试图让它工作,或者2)其他事情正在发生,我们永远不会知道没有例外的细节。
我强烈建议您尝试在新的全新WPF项目中重新制作此代码。执行以下步骤(并且仅执行以下步骤):
创建一个新的WPF项目,将相同的画笔添加到app.xaml,然后打开Window1并将窗口背景绑定到资源。运行应用程序。
它应该按预期工作。如果不是,则返回异常详细信息。如果确实如此,请将这个新项目与您当前的项目进行比较,以查看您所做的改变。
如果您已设置启动对象为自定义类,你需要创建自定义的应用程序类,并调用它的InitializeComponent方法,像这样:
App app = new App();
app.InitializeComponent();
更新:由于@ qqww2建议InitializeComponent
通话可以在App
类构造函数中移动。
我知道有一个已经被接受的答案,但我想我也会添加我的解决方案。我有代码工作,但一些配置更改打破了设计器中的资源引用。在执行代码时,它工作正常。
经过一些初步研究,我确定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();
}
}
}
然后在项目设置,更改应用程序 - >启动对象,以便选择新类。
我有一个类似的问题,并解决了它,所以我想我不妨发布我的解决方案。如上所述,我一直只在运行时遇到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很陌生。
我可以认为,如果你在App构造函数中有某些东西,资源会很容易混乱。将自己的全局对象的初始化移动到OnStartup方法中:
protected override void OnStartup(StartupEventArgs e)
{
}
感谢您的建议,它终于有效。我明确地将项目属性中的启动对象设置为我自己定义的某个类。我将其改为“(未设置)”,它起作用。多么奇怪...... – DerKlaus 2010-03-21 15:33:56
这实际上是有道理的。未设置将导致App.xaml被解释为找出在启动时要做什么。将它设置为你自己的类将导致这种情况不会发生,除非你明确做到了。 – 2010-03-21 15:39:46
@DerKlaus - 感谢您的评论!我将App.xaml的构建操作设置为Page,这样我就可以创建自己的入口点。 (这当然会导致我在设计时从加载样式中丢失我的共享资源字典)。我不知道在读取评论之前,我可以在项目属性中设置启动对象。这使我可以将App.xaml的构建操作设置回应用程序定义!再次感谢! – Scott 2010-05-27 20:21:07