IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[BUG?4.0][ContextMenu] System.Windows.Controls.MenuItem : Lier lorsque l'item est selectionné


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut [BUG?4.0][ContextMenu] System.Windows.Controls.MenuItem : Lier lorsque l'item est selectionné
    Bonsoir,

    J'ai un souci en WPF 4:
    Je souhaite faire un ContextMenu dymanique en code CS, pour cela j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    ContextMenu mainMenu = new ContextMenu();
    MenuItem formatMenu = new MenuItem();
     
    formatMenu.Header = "Test";
    formatMenu.Foreground = System.Windows.Media.Brushes.Black;
    formatMenu.Background = System.Windows.Media.Brushes.Transparent;
     
    MenuItem currentItemFormat = new MenuItem();
    currentItemFormat.Header = "titi";
    currentItemFormat.Tag = "tititag;
     currentItemFormat.Foreground = System.Windows.Media.Brushes.Black;
    currentItemFormat.Background = System.Windows.Media.Brushes.Transparent;
     
    currentItemFormat.Click += menuItem_Click;
    currentItemFormat.PreviewMouseDown += menuItem_Click;
     
    formatMenu.Items.Add(currentItemFormat);
    mainMenu.Items.Add(formatMenu);
    return mainMenu;
     
     
     
    private void menuItem_Click(object sender, System.Windows.RoutedEventArgs e)
            {
                System.Windows.MessageBox.Show("Yop");
            }
    J'ai un souci lorsque je click sur le MenuItem et bien aucun événement se déclenche !
    Comment faire pour que lorsqu on séléctionne un item et bien on rentre dans une méthode ?

    Merci

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Je ne sais pas si tout le code et présent, mais il manque l'ajout du MenuItem 'formatMenu' au ContextMenu 'mainMenu'. Soit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    mainMenu.Items.Add(formatMenu);

    Sinon l'abonnement à l'évènement PreviewMouseDown n'est pas nécessaire. L'évènement Click suffit.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,

    Je ne sais pas si tout le code et présent, mais il manque l'ajout du MenuItem 'formatMenu' au ContextMenu 'mainMenu'. Soit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    mainMenu.Items.Add(formatMenu);

    Sinon l'abonnement à l'évènement PreviewMouseDown n'est pas nécessaire. L'évènement Click suffit.

    binoo oui en effet j'ai mal C/C le code, l'ajout se fait bien, le menu marche bien, il s'affiche comme il faut !
    Seul les évènements sont à la ramasse.... c'est désespérant

    j'ai essayé plein de trucs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentItemFormat.Click += new System.Windows.RoutedEventHandler(MenuItemCheck_Checked);
    essayer de me greffer sur d'autre event, rien n'y fait !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    C'est vrai que j'ai fais comme dans
    http://www.rizalalmashoor.com/blog/i...silverlight-4/

    je vois pas ce qui va pas... grr

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    J'avoue J'ai fait la même chose un paquet de fois déjà et j'ai jamais eu de problême... Ca doit être tout bête à tous les coups, mais là je ne vois pas...

    Essaies toujours un Clean/Rebuild de ta solution, refais un projet test avec juste ce menu contextuel pour voir si tu as toujours le problème (et si oui partage le projet pour qu'on voit si on a le même problème chez nous). Pas mieux à te proposer pour l'instant...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Bon à premiere vu j'arrive dans "certaines conditions" / que je ne maitrise pas tout à fais bien, a produire l'évènement (genre clic droit, puis click droit pour sélectionner le premier menu, puis clic gauche)

    Ca ressemble à un gros problème de Focus ... étrange !

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Ça vient peut-être d'un style que tu as défini. Si tu en as défini un, enlève le pour voir si ce problème est toujours présent.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Ca vient d'un bug:

    En fait quand je clique et que ma souris est au dessus du Treeview alors l'event marche, dès lors que ma souris est à l'exterieur du control Treeview : l'event est inhibé !

    incroyable...

    et je ne sais pas quoi faire !

    http://www.netframeworkdev.com/windo...ew-28619.shtml


    Bon il faut noter qu'au clavier avec la touche Enter, ca marche meme quand la souris est en dehors du control Treeview
    je vais devenir fou

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    OK c'est encore plus subtile:
    J'ai créé un Add In word (un volet a droite)

    le clique est complètement inibé lorsqu on sort de ce volet (et non pas comme je le disais auparavant sur le treeview !)


    pinaise...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Pour reproduire Mon problème je joins un code très simple (Visual Studio 2010 par contre / marche sous Office 2007 & 2010, F5 & rulez)



    Avec le projet ci-joint il est possible de reproduire le problème :

    C’est un projet add in word 2010, avec un UserControl WinForm qui contient un UserControl WPF, dans lequel il y a un bouton :
    Pour reproduire le bug il faut respecter ces étapes :
    - Clic gauche sur le bouton (pour lui donner le focus)
    - Clic droit pour afficher le menu contextuel
    - Si on clic sur un MenuItem en dehors du volet, alors il n’y a pas de message « OK !! » l’évènement est inhibé
    - Si on clic sur un MenuItem alors que la souris est présent dans le volet, alors l’évènement est actif, le MessageBox OK s’affiche

    Il est à noter que le phénomène ne se reproduit pas lorsqu’on utilise la touche Enter du clavier (peu importe où se trouve la souris l’évènement à toujours lieu au clavier)

    Voilà
    C’est un projet minimaliste qui permet de reproduire mon soucis


    Merci !
    Fichiers attachés Fichiers attachés

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Le problème est bien là. Il semblerait que ce soit un bug... Peut-être du à l'interopérabilité. Je dis ça car le problème n'est pas présent avec un ContextMenu Windows Form.

    Tu peux tester en faisant la manip vite fait. Au lieu d'intégrer ton bouton WPF, tu ajoutes un bouton WinForm et tu crées ton ContextMenu dynamiquement :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        private ContextMenu GetContextmenu() {
          ContextMenu mainMenu = new ContextMenu();
          MenuItem formatMenu = new MenuItem();
     
          formatMenu.Text = "Format";
     
          MenuItem mItem1 = new MenuItem();
          mItem1.Text = "mItem1";
          mItem1.Tag = "mItem1";
          mItem1.Click += mItem1_Click;
          formatMenu.MenuItems.Add(mItem1);
     
          MenuItem mItem2 = new MenuItem();
          mItem2.Text = "mItem2";
          mItem2.Tag = "mItem2";
          mItem2.Click += mItem1_Click;
          formatMenu.MenuItems.Add(mItem2);
     
          mainMenu.MenuItems.Add(formatMenu);
          return mainMenu;
        }
     
        private void mItem1_Click(object sender, EventArgs e) {
          MessageBox.Show("OK WinForm !!");
        }
    Et là tu pourras voir que le bug n'est pas présent...

    Je sais que l'interopérabilité pose parfois des problème :
    http://msdn.microsoft.com/fr-fr/library/ms751797.aspx

    Est-ce que c'est bien la cause du problème. A voir... Il faudrait poser la question sur un forum Microsoft.

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Une solution de contournement :
    • Placer un contrôle WindowsForm prenant le focus (type CheckBox) sur le UserControl Windows Form
    • L'ElementHost peut-être ancré après cet ajout
    • Envoyer la CheckBox en arrière plan (pour ne pas la voir à l'affichage)
    • Abonner le ContextMenu à l'évènement Loaded pour déplacer le focus.



    Pour envoyer la CheckBox en arrière plan :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      public partial class UserControlWinForm : UserControl {
     
        public UserControlWinForm() {
          InitializeComponent();
          this.checkBox1.SendToBack();
        }
     
      }

    Pour abonner le ContextMenu à l'évènement Loaded et déplacer le focus :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    mainMenu.Loaded += new RoutedEventHandler(mainMenu_Loaded);

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        void mainMenu_Loaded(object sender, RoutedEventArgs e) {
          this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous));
        }

    L'ajout d'un contrôle WindowsForm est le seul moyen que j'ai trouver (vite fait) pour déplacer le Focus... De la bonne bidouille, à éprouver dans ton contexte...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    binoo
    Merci de t'avoir donné tant de mal !
    Je vais essayer de bidouiller en m'inspirant de ta soluce, je vous tiens au jus

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    binoo
    Ba écoute je te remercie ta rustine marche sur mon treeview WPF...
    2 jours que je me traine ce machin, et toi tu me trouves une solution "bidouille" mais qui à le mérite de marcher !
    Parfois j'aimerais vraiment pouvoir remercier les gens autrement que par un message, mais le cœur y est !

    Bonne journée à toi

    PS: j'ai contacté un type de chez Microsoft, s'il trouve une "meilleurs solution" je la posterai ici

  15. #15
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Ok. Content que ça fonctionne dans ton contexte.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    J'ai eu un retour des équipes de Microsoft, donc c'est bien un Bug de l'utilisation du WPF dans VSTO, ce bug ne sera pas corrigé à court terme (difficulté technique, impact pas jugé suffisant pour le mettre en priorité)

    Ils m'ont donné une autre astuce, mais je ne sais pas si c'est plus "propre", à premiere vue ca marche aussi bien que ta solution binoo:

    l'avantage c'est qu'on fait tous depuis le code xaml.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
            public UserControl1()
            {
                InitializeComponent();
     
                DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromName("IsOpen", typeof(ContextMenu), typeof(ContextMenu));
                dpd.AddValueChanged(MyMenu, new EventHandler(OnContextMenuIsOpenChanged));
            }
     
     
            private DispatcherFrame _frame;
     
            private void OnContextMenuIsOpenChanged(object sender, EventArgs e)
            {
                if (MyMenu.IsOpen)
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Normal, (DispatcherOperationCallback)delegate(object unused)
                    {
                        _frame = new DispatcherFrame();
                        Dispatcher.PushFrame(_frame);
                        return null;
                    }, null);
                }
                else
                {
                    _frame.Continue = false;
                }
            }

  17. #17
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Merci pour le retour

    C'est plus sympa en effet (pas besoin d'ajouter un contrôle).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Stretch horizontal sur un System.Windows.Controls.Image
    Par la_urre dans le forum Windows Phone
    Réponses: 2
    Dernier message: 27/07/2011, 16h27
  2. [WPF]Sérializer un System.Windows.Control
    Par Babas007 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 21/10/2010, 21h00
  3. [WPF]BackgroundImage du System.Windows.Control
    Par Babas007 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/10/2010, 22h17
  4. Réponses: 1
    Dernier message: 04/03/2010, 16h08
  5. un control de gestion de systeme windows toute faite
    Par infostars dans le forum ASP.NET
    Réponses: 0
    Dernier message: 04/02/2009, 12h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo