none
Cast du type 'System.Windows.RoutedEventHandler' en 'System.Windows.Input.ExecutedRoutedEventHandler'

    Question

  • Bonjour à tous,

    Je tente de creer dynamiquement des raccourcis clavier à l'appel d'une page. Pour ce faire, je liste tous les butons de la page appelée et en extrait les infos.

    Exemple 

    Xaml:

          <Button x:Name="Btn_Add"
            ToolTip="{Binding Path=PageStrings.TooltipAddTest, Source={StaticResource ApplicationResources}}"
            Click="Btn_AddTest_Click"/>

    Behind:

      private async void Btn_AddTest_Click(object sender, RoutedEventArgs e)
        {...}

    Je liste mes boutons:

    List<Button> ListButton = new List<Button>();
    ListButton = FindVisualChildren<Button>(page).ToList();
    
    foreach (Button Ctrl in ListButton)
       { ... }

    Donc dans mes infos, extraites de cette façon:

       var eventStore = Ctrl.GetType().GetProperty("EventHandlersStore", BindingFlags.Instance | BindingFlags.NonPublic)
                            .GetValue(Ctrl, null);
    
       var clickEventInfo = ((RoutedEventHandlerInfo[])eventStore.GetType()
                            .GetMethod("GetRoutedEventHandlers", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                            .Invoke(eventStore, new object[] { Button.ClickEvent }))
                            .First();  
    
            string EventString = clickEventInfo.Handler.Method.Name; // For debug = Btn_AddTest_Click

    Je retrouve le Handler de chaque bouton(clickEventInfo.Handler) qui est de type RoutedEventHandler. Il me reste donc à créer le CommandBinding pour le raccourci clavier, mais le CommandBinding requiert en second paramètre un ExecutedRoutedEventHandler et non pas un RoutedEventHandler

    ExecutedRoutedEventHandler ExecutedRoutedEvent = new ExecutedRoutedEventHandler((ExecutedRoutedEventHandler)clickEventInfo.Handler);

    RoutedCommand NewCommand = new RoutedCommand(); NewCommand.InputGestures.Add(ExtractKey(Ctrl.ToolTip.ToString())); CommandBinding NewCommandBinding = new CommandBinding(NewCommand); NewCommandBinding.Executed += ExecutedRoutedEvent; page.CommandBindings.Add(NewCommandBinding);

    C'est donc dans cette ligne qu'une erreur se produit:

     ExecutedRoutedEventHandler ExecutedRoutedEvent = new ExecutedRoutedEventHandler((ExecutedRoutedEventHandler)clickEventInfo.Handler);

    ERREUR:"Impossible d'effectuer un cast d'un objet de type 'System.Windows.RoutedEventHandler' en type 'System.Windows.Input.ExecutedRoutedEventHandler'."

    Ce qui est surprenant c'est que si je déclare cette ligne directment avec la méthode du bouton (Btn_AddTest_Click), cela fonctionne très bien!

    ExecutedRoutedEventHandler ExecutedRoutedEvent = new ExecutedRoutedEventHandler(Btn_AddTest_Click);

    Il s'agit donc d'un problème de typage.

    Quelqu'un aurait il une idée pour détourner ce soucis?

    mardi 27 juin 2017 09:49

Réponses