非常简单的问题,但我没有取得进展,所以我想我应该问......
我正在编写一个小型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();
}
答案 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
,就像你对'常规'代码文件那样。