2011-06-22 9 views
7

Bardzo prosty problem, ale robię żadnych postępów, więc pomyślałem, że powinienem zapytać ...App OnStartup nigdy nie jest wywoływana

Piszę mały prototyp WPF gdzie umieściłem bagażnik się logiki gdzie wierzę należy: W (nadpisanej) metodzie App.OnStartup.

Problem polega na tym, że metoda nigdy nie jest wywoływana i nie mam pojęcia dlaczego!

Przeglądałem niektóre i znalazłem kogoś, kto powiedział, że znacznik <Application> w App.xaml musi określić klasę wykonawczą (App) w atrybucie "x:Class". Zmieniłem go z x:Class="Application" na x:Class="App", ale to nie miało znaczenia.

Czego mi tu brakuje?

EDIT: Oto kod ...

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> 

kod za ...

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

Co powiesz na zamieszczenie kodu? –

+0

Nie publikuj go w komentarzach. Edytuj pytanie. –

+0

Tak, zdałem sobie sprawę, że komentarze będą nieczytelne. To jest teraz pytanie ... –

Odpowiedz

18

Edycja: Twój XAML wydaje się nie być związane z kodem tyłu, x:Class musi zawierać nazw twojej klasy App. na przykład MyWpfApplication.App.


Jeśli nie pisać jakiś kod, który po prostu dziki zgadywania, oto moje: Nie właściwie zastąpić metodę jednak ukryć go z metody o tej samej nazwie i podpis.

To co jest odstąpienie pracy powinien wyglądać następująco:

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

Jak sugeruje można użyć zdarzenia Startup zamiast, ale nie muszą, wspomagania StartupUri będą realizowane w uzupełnieniu do kodu w override.

+0

Dzięki H.B! Włączenie przestrzeni nazw dało podstęp. Muszę powiedzieć, że jestem nieco zirytowany, że (a) kompilator nie skarżył się na nie znajdowanie odnośnej klasy i że (b) VS2010 nie ustawił klasy aplikacji do automatycznego odniesienia. Oznacza to, że nadpisywanie metod aplikacji nigdy nie zadziała po wyjęciu z pudełka. W każdym razie, dziękuję dużo! –

+0

Nie ma za co, że się udało; Muszę powiedzieć, że jestem trochę zawstydzony moją wcześniejszą nieśmiałością, ten problem mógł rzeczywiście zostać rozwiązany bez kodu. Właściwie to 'x: Class' powinno być poprawne po wyjęciu z pudełka, przynajmniej było dla mnie. –

+0

Nie bądź. Jestem doświadczonym programistą, ale WPF jest dla mnie bardzo nowy, więc doceniam, że poświęcasz trochę czasu. To drugi numer, który mi pomógł. Naprawdę doceniam to kolega! Mam nadzieję, że kiedyś mogę dla ciebie zrobić to samo! : O) –

2

potrzebny jest podłączenie Podprogram:

<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"> 
+1

Nie, nie robisz tego. –

+0

Zgadzam się z H.B. tutaj. Chociaż nie jestem pewien, kiedy użyć jeden nad innymi nadrzędnego OnStartup() powinien działać dobrze. –

2

Jako alternatywę dla @ odpowiedź Filipa, można również podłączyć się w opóźnieniem kodu:

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

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

W moim przypadku zmieniłem nazwę projektu i przestrzeni nazw. Wtedy wszystkie metody w kodzie źródłowym już się nie uruchamiały.

The x:Class nadal pokazywał stary obszar nazw. Klasa App odwoływała się po prostu do innej przestrzeni nazw, która nie była używana, i nic na to nie narzekali.

W związku z tym należy zmienić nazwę na x:Class, tak jak w przypadku zwykłych plików kodu.

Powiązane problemy