2010-01-19 5 views
1

Sit Rep J'ai une application WPF. Dans le constructeur du code-behind (C#), j'attache un gestionnaire d'événements de bouton. Le problème est, il ne s'attache pas! Mais si je l'attache en cliquant sur un bouton de l'interface utilisateur, le bouton fonctionne bien. Aussi, bien sûr, si je l'attache dans le XAML du bouton, cela fonctionne aussi. Donc, il semble que le prob attache le gestionnaire dans le constructeur. Il semble être trop tôt dans le processus.WPF: Les gestionnaires d'événements dans le constructeur de Codebehind ne se connectent pas

App Image

C'est ce que je veux, mais ne pas attach:

public MainWindow() 
{ 
    InitializeComponent(); 

    //... 
    // 
    // TEST RADIO BUTTONS 
    // 
    // THIS HANDLER DOESN'T ATTACH! 
    ui_Test.Click += (object sender, RoutedEventArgs e) => 
    { 
     bool localOnly = Convert.ToBoolean(ui_rdoLocal.IsChecked); 
     bool onlineOnly = Convert.ToBoolean(ui_rdoOnline.IsChecked); 
     bool both = Convert.ToBoolean(ui_rdoBoth.IsChecked); 

     string message = "Local: {1}{0}Online: {2}{0}Both: {3}".Put(nl, localOnly, onlineOnly, both); 
     MessageBox.Show(message); 
    }; 

    //... 
} 

Et voici le code pour un deuxième bouton de test qui fixe le code ci-dessus via un bouton clic. Ce gestionnaire est défini dans XAML. Le gestionnaire fonctionne alors, mais je veux attacher le gestionnaire en C#, pas XAML.

<Button Name="ui_Test2" Content="Attach Annonymous Handlers" Margin="30,10" Click="ui_Test2_Click"></Button> 

Et la méthode:

/// <summary> 
    /// Attaches control handlers. Will they attach now? YES!! 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void ui_Test2_Click(object sender, RoutedEventArgs e) 
    { 
     ui_Test.Click += (object sndr, RoutedEventArgs rea) => 
      { 
       bool localOnly = Convert.ToBoolean(ui_rdoLocal.IsChecked); 
       bool onlineOnly = Convert.ToBoolean(ui_rdoOnline.IsChecked); 
       bool both = Convert.ToBoolean(ui_rdoBoth.IsChecked); 

       string message = "Local: {1}{0}Online: {2}{0}Both: {3}".Put(nl, localOnly, onlineOnly, both); 
       MessageBox.Show(message); 
      }; 
    } 

Thx à l'avance pour toute aide!

Gregg

+0

Votre code semble bien, et il n'est pas trop tôt dans le processus (puisque vous êtes après InitializeComponent). Je viens de faire un test et (une version simplifiée de) votre code fonctionne pour moi. Avez-vous essayé un repro simplifié? Si vous placez un point d'arrêt sur l'affectation de clic, est-il déjà atteint? (Par exemple pourrait-il y avoir une exception plus tôt dans le constructeur qui l'a fait sauter?) – itowlson

+0

Vous étiez juste sur - il y avait une exception levée avant que le gestionnaire soit attaché. Ecrivez votre réponse comme une réponse et je vais lui donner la grosse tique. :-) – MrGreggles

Répondre

0

Essayez de gestionnaire joindre après l'appel InitializeComponent(); dans le constructeur.

+0

Merci. En fait, c'est après cet appel. Je vais l'ajouter ci-dessus pour clarifier pour les autres cependant. – MrGreggles

Questions connexes