我使用的是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中定义的资源?
答案 0 :(得分:19)
如果您已将启动对象设置为自定义类,则需要创建自定义Application类并调用其InitializeComponent方法,如下所示:
App app = new App();
app.InitializeComponent();
更新:由于@ qqww2建议可以在InitializeComponent
类构造函数中移动App
调用。
答案 1 :(得分:5)
你所做的一切都是错误的。您要么以某种方式搞砸了项目构建,而是随机做事以试图让它工作或2)其他事情在这里进行,如果没有异常细节,我们永远不会知道。
我强烈建议你尝试在一个全新的WPF项目中重复这一点。执行以下步骤(并且仅执行以下步骤):
创建一个新的WPF项目,将完全相同的画笔添加到app.xaml,然后打开Window1并将窗口的背景绑定到资源。运行应用程序。
它应该按预期工作。如果没有,请返回异常详细信息。如果是这样,请将此新项目与当前项目进行比较,以了解您的工作方式不同。
答案 2 :(得分: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();
}
}
}
然后在项目设置中,更改应用程序 - &gt;启动对象,以便选择新类。
答案 3 :(得分: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的新手。
答案 4 :(得分:3)
我可以同意,如果你在App构造函数中有东西,资源就会很容易搞砸。将您自己的全局对象的初始化移动到OnStartup方法:
protected override void OnStartup(StartupEventArgs e)
{
}
答案 5 :(得分:0)
我以StartupUri
中的App.xaml
,但以App.xaml.cs
中的事件处理程序来启动我的应用程序不是。
在使用override Startup()
的App.xaml资源时,未加载:
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)
{
...
}
}