WPF - 继承自 System.Windows.Application

7

我希望创建一个继承自System.Windows.Application的应用程序类。问题在于,在Application.xaml文件中,我必须像这样声明应用程序:

    <src:MyBaseApplication x:Class="MyApplication"
    xmlns:src="clr-namespace:MyApplication;assembly=WpfTestApplication"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="FPrincipal.xaml">    
    <Application.Resources>
        
    </Application.Resources>
</src:MyBaseApplication>

在运行时它工作得很好,但是当我编辑项目属性时,Visual Studio的项目属性编辑器会显示以下错误消息:
“尝试加载此项目的应用程序定义文件时发生错误。文件 '[...]\Application.xaml' 无法解析。请在XAML编辑器中编辑文件以修复错误。 在应用程序定义文件中找不到预期的根元素“Application”。
该项目是VB.NET项目。有人有解决方法吗?我想保留application.xaml文件。

1
你解决了这个问题吗? - Simon Gillbee
我刚试了一下,没有错误,我能够从System.Windows.Application中派生出来,然后在我的App.Xaml中使用它,一切都按照预期工作,没有视图抱怨任何问题。 - adminSoftDK
@DanielLeiszen 抱歉,我没有注意到。不,我在VS2015中尝试过了。 - adminSoftDK
是的,我的电脑上甚至没有VS2008。我不确定这个问题是否仍然相关,我怀疑这个赏金是一个错误... - Daniel Leiszen
@DanielLeiszen 我刚在VS 2015中创建了一个干净的解决方案,其中包括两个VB.NET项目--一个类库,其中包含从System.Windows.Application继承的类,以及一个引用该类库的WPF应用程序。问题仍然存在。 - Zev Spitz
显示剩余3条评论
4个回答

2
我已经尝试过在Visual Studio 2013中运行,但没有遇到任何问题。所以,这应该是VS 2008特有的问题。你尝试将你的应用程序类重新组织到一个单独的类库中了吗?也许这是一个锁定问题。 更新 为了使其生效,在VB.NET VS2013中我进行了以下步骤:
  1. 创建自定义应用程序类。我将其创建在同一程序集中。我的程序集名称为:WPFVBTest。
Public Class CustomApplication
  Inherits System.Windows.Application

End Class
  1. 修改 Application.xaml。添加命名空间引用并将根容器更改为自定义应用程序类。
  <self:CustomApplication x:Class="Application"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:self="clr-namespace:WPFVBTest"
        StartupUri="MainWindow.xaml">
    </self:CustomApplication>
  1. 修改Application.xaml.vb文件中的代码,使其继承自CustomApplication类
Class Application
  Inherits CustomApplication

End Class
  1. 构建应用程序。应该会出现一个错误,指示MyWpfExtension.vb与应用程序类名不同步。这是一个生成的类,但不是在每次构建时重新生成的。我知道这是作弊,但这是我能想到的唯一方法。因此,我手动修改了它:
Partial Class Application
  Inherits CustomApplication

这样应用程序就可以顺利构建和运行。希望它能帮助您解决错误。


我在VS 2015中仍然遇到问题。对于我的情况(我设置了赏金),MyBaseApplication类存在于一个类库中。你所说的锁定问题是什么意思? - Zev Spitz
我所能想到的是,VS无法加载自定义应用程序类,因为它正在使用中。也许是VS本身在使用它,或者其他一些应用程序在使用它。当您右键单击项目并尝试打开属性时是否会发生这种情况?您是否在VS中使用任何其他可以使用该程序集的工具?Reflector.NET或其他第三方工具? - Daniel Leiszen
请确认一下 - 你是用 VB.NET 做这个吗? - Zev Spitz
请查看更新的答案。我包含了我使用的VB.NET代码。 - Daniel Leiszen

1
我知道这可能不是受欢迎的答案,但是... 为什么不升级到Visual Studio 2015呢?它是免费的!天哪,他们昨天宣布了VS 2017;同样是免费的。

我正在使用VS 2015,但它仍然无法工作。你是在使用C#还是VB.NET? - Zev Spitz

-1

应用程序通常指向一个窗口,并尝试从xaml文件中获取此信息;但是您的xaml文件中有一个引用,Visual Studio无法确定。

xmlns:src="clr-namespace:MyApplication;assembly=WpfTestApplication"

所以VS无法解析您的xaml文件,因此会出现该错误...

我的建议是:重写Window,或者在Application上使用扩展,像这样:

public static class ApplicationExtensions
{
    public static string GetAwesomeName(this Application)
    {
        return "I am an awesome application";
    }
}

使用方法如下:

Application.Current.GetAwesomeName();

你漏掉了一些东西。错误信息指出缺少Application标签。这是正确的,因为根标签是src:MyBaseApplication。VisualStudio应该足够聪明,能够找到具有不同名称的根标签。我已经知道可以在C#中子类化应用程序,但这样做会失去与应用程序相关联的.xaml文件。 - Karol Deland
你有没有考虑将那些 XAML 片段切分成 ResourceDictionary,并将其包含在应用程序的资源中? - Arcturus

-1

它应该写成 < src:MyBaseApplication.Resources > 吗?


你可以这样做,但是既然你继承了Application类,也可以使用Application.Resources... - Arcturus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接