App OnStartup永远不会被调用

时间:2011-06-22 15:16:05

标签: wpf startup

非常简单的问题,但我没有取得进展,所以我想我应该问......

我正在编写一个小型WPF原型,我放置了靴子 我相信它所属的逻辑:在(被覆盖的)App.OnStartup方法中。

问题是方法永远不会被调用,我不明白为什么!

我浏览了一些,发现有人说App.xaml中的<Application>标记必须在“App”属性中指定实现类(x:Class)。我将其从x:Class="Application"更改为x:Class="App",但没有任何区别。

我在这里缺少什么?

编辑: 这是代码......

XAML:

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="App"
    ShutdownMode="OnMainWindowClose"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Recources\Brushes\Brushes.xaml"/>
                <ResourceDictionary Source="Recources\Templates\Templates.xaml"/>
                <ResourceDictionary Source="Recources\Styles\GVSStyles.xaml"/>
                <ResourceDictionary Source="Recources\Styles\TimePicker.xaml"/>
                <ResourceDictionary Source="Recources\Icons\GVSIcons.xaml"/>
                <ResourceDictionary Source="Recources\Icons\BottleIcon.xaml"/>
                <ResourceDictionary Source="Recources\Styles\BusyAnimationStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

代码背后......

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    // lower default framerate from 60 to 20 to save CPU ...
    Timeline.DesiredFrameRateProperty.OverrideMetadata(
        typeof(Timeline),
        new FrameworkPropertyMetadata { DefaultValue = 20 });

    hookUpViews();
    connectToServer();
}

4 个答案:

答案 0 :(得分:20)

编辑:您的XAML似乎与后面的代码无关,x:Class需要包含App类的命名空间。例如MyWpfApplication.App


除非您发布一些代码,否则您只是疯狂猜测,这是我的:您没有正确覆盖该方法,但使用相同名称和签名的方法隐藏它。

这是一个工作覆盖应该是这样的:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    MessageBox.Show("!");
}

根据建议,您可以改为使用Startup事件,但除了覆盖中的代码之外,还会执行StartupUri

答案 1 :(得分:2)

作为@ Philippe答案的替代方案,您还可以连接代码隐藏:

public App()
{
  this.Startup += new StartupEventHandler(App_Startup);
}

void App_Startup(object sender, StartupEventArgs e)
{
   //do stuff here...
}

答案 2 :(得分:1)

您需要连接EventHandler:

<Application x:Class="Abc.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup">

答案 3 :(得分:0)

在我的情况下,我重命名了项目和命名空间。然后,代码中的所有方法都不再触发。

x:Class仍然显示旧的命名空间。 App类只是引用了另一个名称空间,但没有任何抱怨。

所以,你做得很简短,你必须重命名x:Class,就像你对'常规'代码文件那样。