App OnStartup никогда не вызывается - PullRequest
8 голосов
/ 22 июня 2011

Очень простая проблема, но я не добиваюсь прогресса, поэтому я подумал, что должен спросить ...

Я пишу небольшой прототип WPF, в котором я разместил логику загрузки там, где, как мне кажется, она принадлежит:(переопределено) Метод App.OnStartup.

Проблема в том, что метод никогда не вызывается, и я понятия не имею, почему!

Я просмотрел некоторые из них и нашел кого-то, говорящего тег <Application> вApp.xaml должен указать реализующий класс (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 ]

20 голосов
/ 22 июня 2011

Редактировать: Ваш XAML, похоже, не связан с кодом позади, x:Class должен включать пространство имен вашего класса App. например MyWpfApplication.App.


Если вы не публикуете некоторый код, вы просто получаете дикие догадки, вот мое: вы не правильно переопределили метод, а скрыли его методом с тем же именем и сигнатурой.

Вот как должно выглядеть рабочее переопределение:

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

Как и предполагалось, вы можете вместо этого использовать событие Startup, но это не обязательно, далее будет выполняться StartupUri в дополнение к коду в переопределить.

2 голосов
/ 22 июня 2011

В качестве альтернативы ответу @ Philippe вы также можете подключиться к коду:

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

void App_Startup(object sender, StartupEventArgs e)
{
   //do stuff here...
}
1 голос
/ 22 июня 2011

Вам необходимо подключить 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">
0 голосов
/ 05 мая 2014

В моем случае я переименовал проект и пространство имен. Тогда все методы в коде больше не запускались.

x:Class все еще показывал старое пространство имен. Класс App просто ссылался на другое пространство имен, которое не использовалось, и ничто не жаловалось на это.

Итак, вы сокращаете, вы должны переименовать x:Class, точно так же, как вы делали бы для «обычных» файлов кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...