无法访问app.xaml中定义的资源

时间:2010-03-21 14:05:18

标签: wpf xaml resources

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

6 个答案:

答案 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)
    {
        ...
    }
}
相关问题