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 :

Un UserControl dans un MenuItem


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut Un UserControl dans un MenuItem
    Bonjour,


    J'ai déjà posé une question dans le même genre il y a quelques semaines, je la repose car je n'ai pas réussi à avancer dessus.

    Voilà mon cas.

    J'ai un menuitem contenant un UserControl. Cependant je ne peux pas cliquer ou accéder à un de mes textboxes ou boutons car dès que je clique le menu se ferme et l'élément est highlighted en bleu.

    Je dois donc redefinir le style de mon menuitem, et c'est la que ça bloque.
    je n'ai encore jamais redéfini de style et je ne sais pas trop comment me lancer dans mon cas.

    j'ai eu beau chercher un cas similaire sur google mais je n'ai rien trouvé malheureusement


    D'après vous quelles propriétés du menuitem dois-je redéfinir ?



    cordialement

  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,

    Voilà un exemple pour redéfinir un style au ContextMenu et ses menuItems :

    Code xml : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    <Window 
      x:Class="WpfApplication2.Window1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:WpfApplication2"
      Height="600"
      Width="800"
      >
     
      <Window.Resources>
     
        <SolidColorBrush x:Key="PopupMenuBackgroundBrush" Color="#FFF6F6F6"/>
        <SolidColorBrush x:Key="MenuPressedBorderBrush" Color="#FF2B5597"/>
        <SolidColorBrush x:Key="DarkOrangeSolidBrush" Color="#FFFB8C3C"/>
     
        <!-- SubmenuItem -->
        <ControlTemplate 
        x:Key="{x:Static MenuItem.SubmenuItemTemplateKey}" 
        TargetType="{x:Type MenuItem}">
          <Border Name="Border" CornerRadius="4" Margin="2,1,2,1" BorderThickness="1" >
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Icon" MinWidth="30" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/>
                <ColumnDefinition Width="13"/>
              </Grid.ColumnDefinitions>
              <ContentPresenter 
              Name="Icon"
              Margin="6,0,6,0"
              VerticalAlignment="Center"
              ContentSource="Icon"/>
              <Border 
              Name="Check"  
              Width="13" Height="13" 
              Visibility="Collapsed"
              Margin="6,0,6,0" 
              Background="Black"
              BorderThickness="1"
              BorderBrush="Purple">
                <Path 
                Name="CheckMark"
                Width="7" Height="7" 
                Visibility="Hidden" 
                SnapsToDevicePixels="False" 
                Stroke="#FFE6F0FA"
                StrokeThickness="2"
                Data="M 0 0 L 7 7 M 0 7 L 7 0" />
              </Border>
              <ContentPresenter 
              Name="HeaderHost"
              Grid.Column="1"
              ContentSource="Header"
              RecognizesAccessKey="True"/>
              <TextBlock x:Name="InputGestureText"
              Grid.Column="2"
              Text="{TemplateBinding InputGestureText}"
              Margin="5,2,0,2"
              DockPanel.Dock="Right" />
          </Grid>
          </Border>
          <ControlTemplate.Triggers>
            <Trigger Property="Icon" Value="{x:Null}">
              <Setter TargetName="Icon" Property="Visibility" Value="Collapsed"/>
            </Trigger>
            <Trigger Property="IsChecked" Value="true">
              <Setter TargetName="CheckMark" Property="Visibility" Value="Visible"/>
            </Trigger>
            <Trigger Property="IsCheckable" Value="true">
              <Setter TargetName="Check" Property="Visibility" Value="Visible"/>
              <Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
            </Trigger>
            <Trigger Property="IsHighlighted" Value="true">
              <Setter Property="BorderBrush" TargetName="Border" Value="{DynamicResource DarkOrangeSolidBrush}"/>
              <Setter Property="Background" TargetName="Border" Value="#FFFFDBAA"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
              <Setter Property="Foreground" Value="{DynamicResource DisabledMenuForegroundBrush}"/>
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
     
        <!-- MenuItem Style -->
        <Style TargetType="{x:Type MenuItem}">
          <Setter Property="OverridesDefaultStyle" Value="True"/>
          <Style.Triggers>
            <Trigger Property="Role" Value="SubmenuItem">
              <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.SubmenuItemTemplateKey}}"/>
            </Trigger>
          </Style.Triggers>
        </Style>
     
        <!-- ContextMenu -->
        <Style TargetType="ContextMenu">
          <Setter Property="SnapsToDevicePixels" Value="True"/>
          <Setter Property="OverridesDefaultStyle" Value="True"/>
          <Setter Property="Grid.IsSharedSizeScope" Value="true"/>
          <Setter Property="HasDropShadow" Value="True"/>
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="ContextMenu">
                <Border Name="Border"
                        Background="{DynamicResource PopupMenuBackgroundBrush}"
                        BorderBrush="{DynamicResource MenuPressedBorderBrush}"
                        BorderThickness="1" CornerRadius="0,8,0,8" >
                  <StackPanel IsItemsHost="True"
                              KeyboardNavigation.DirectionalNavigation="Cycle"/>
                </Border>
                <ControlTemplate.Triggers>
                  <Trigger Property="HasDropShadow" Value="true">
                    <Setter TargetName="Border" Property="Padding" Value="0,3,0,3"/>
                    <Setter TargetName="Border" Property="CornerRadius" Value="4"/>
                  </Trigger>
                </ControlTemplate.Triggers>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
     
      </Window.Resources>
     
      <Grid>
     
      </Grid>
     
    </Window>

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.ComponentModel;
    using System.Collections.ObjectModel;
     
    namespace WpfApplication2 {
      /// <summary>
      /// Interaction logic for Window1.xaml
      /// </summary>
      public partial class Window1 : Window {
     
        ContextMenu CtMenu = new ContextMenu();
        MenuItem m11 = new MenuItem();
        MenuItem m12 = new MenuItem();
     
        public Window1() {
          InitializeComponent();
     
          m11.Header = new UserControl1();
          m12.Header = "item...";
     
          this.CtMenu.Items.Add( m11 );
          this.CtMenu.Items.Add( m12 );
     
          this.ContextMenu = this.CtMenu;
        }
     
      }
     
    }


    Pour le coup du UserControl dans le MenuItem, j'ai ajouté un UserControl basique avec une TextBox et un bouton et je parviens à interagir avec eux.

    Code du UserControl :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <UserControl 
      x:Class="WpfApplication2.UserControl1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Height="50" Width="200">
     
      <Grid>
        <StackPanel Orientation="Horizontal" >
          <TextBox Margin="5" Width="75" />
          <Button Margin="5" Width="75" />
        </StackPanel>
     
      </Grid>
     
    </UserControl>

  3. #3
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Ah super merci.

    tu as testé avec le code que tu viens de montrer?

  4. #4
    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
    Citation Envoyé par gregorylepacha Voir le message
    Ah super merci.

    tu as testé avec le code que tu viens de montrer?
    Oui.

  5. #5
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par binoo Voir le message
    Oui.
    Merci beaucoup j'essaierai ce soir

  6. #6
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Salut,

    Je suis en train de tester ce que tu as fait.

    Comment applique tu ce que tu as fait à ton contextmenu et aux menuitems?

  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
    Cela s'applique par défaut dans l'exemple fournit. Je n'ai pas spécifier de clé. Ex :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Style TargetType="ContextMenu">
    </Style>

    Si tu veux pas que ce soit ainsi il faut définir une clé via x:Key et appliquer le style à partir du Contrôle sur lequel tu veux l'appliquer.

  8. #8
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Salut,

    Je ne comprends pas je n arrive pas à intégré ce que tu as fait dans mon projet alors que jai essayé dans un nouveau et cela marche.


    je fais ceci:

    j'ai mit en commentaire pour ce ne soit pas appliqué(ce qui est le cas) mais n affiche pas le style que tu as fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    //Uri u = new Uri("Resources\\Menu.xaml", UriKind.Relative);
     
                    //ResourceDictionary res = System.Windows.Application.LoadComponent(u) as ResourceDictionary;
     
                    //Style s = res["CKeyMenu"] as Style;
                    //Cmenu.Style = s;
    pour afficher mon menu.
    Je fais comme ceci car je passe par un systray

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public void m_notifyIcon_Click(object sender, EventArgs e)
            {
                Cmenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Mouse;
                Cmenu.IsOpen = true;
            }

  9. #9
    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
    Euh j'ai pas saisi

    Ce n'est pas encore comme tu le voudrais ?

  10. #10
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Si si c est comme je voulais.
    Sauf que je n'arrive pas à l'intégré dans mon projet.
    J'ai donc créé un autre projet pour réessayer et ca marchait dans celui la.


    Je comprends pas pkoi ca ne marche pas mon projet

  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
    Difficile à dire. Et tu as une erreur ?

  12. #12
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Non je n'ai pas d'erreur.
    Ne devrais pas quand meme essayé d'ajouter le style à mon contextmenu et menuitem?


    Pour l'instant j'ai déja un style mais ne fait pas ce que je veux. je faisais comme ceci. j'ai mit en commentaire pour tester ce que tu m'as donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    //Uri u = new Uri("Resources\\Menu.xaml", UriKind.Relative);
     
                    //ResourceDictionary res = System.Windows.Application.LoadComponent(u) as ResourceDictionary;
     
                    //Style s = res["CKeyMenu"] as Style;
                    //Cmenu.Style = s;

  13. #13
    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
    Comme je te l'ai dit, les styles que j'ai mis sont appliqués par défaut, donc cela devrait fonctionner. Mais tu peux toujours essayer.

    Pour le faire, ajoute x:Key aux styles que j'ai créé :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Style x:Key="MonContextMenustyle" TargetType="ContextMenu">
      ...
    </Style>

    Puis pour l'appliquer au ContextMenu :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Cmenu.Style = (Style)this.FindResource( "MonContextMenustyle" );

    Et la même chose pour les MenuItem

  14. #14
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    J'ai trouvé le probleme.

    Je m'explique,le style du context menu marche tres bien quand je fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                InitializeComponent();
                Cmenu = new System.Windows.Controls.ContextMenu();
                System.Windows.Controls.MenuItem m = new System.Windows.Controls.MenuItem();
                m.Header = "Greg";
                Cmenu.Items.Add(m);
                Cmenu.Items.Add(new UCOptions(this));
                this.ContextMenu = Cmenu;
    Mais par contre quand je fais ceci, ca ne marche plus. je suis pourtant dans la meme fenetre et il s'agit du meme ContextMenu.
    Dans ce cas le style par défaut est affiché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public void m_notifyIcon_Click(object sender, EventArgs e)
            {
                Cmenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Mouse;
                Cmenu.IsOpen = true;
            }
    je comprends pas la ...

  15. #15
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    J'ai réussi à avancé sur mon probleme mais je suis confronté à un nouveau probleme.

    En fait j'applique contextmenustyle à mon contextmenu, de meme pour mes menuitems, comme ci dessous, mais le probleme est que le style du contextmenu ne marche pas, quand j affiche mon contextmenu, tout est transparent mais quand je passe sur mes items le style des items fonctionne.

    D'autre part, j'ai remarqué que pour que le style du contextmenu fonctionne je dois en premier lieu l'afficher à partir du controle wpf, et ensuite le stle fonctionne sur un controle winform ( dans mon cas le systray).

    Mais comme le style des mes items fonctionne il doit bien avoir un moyen de le faire fonctionné le style du contextmenu....



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <!-- MenuItem Style -->      
            <Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle">      
    ...      
    </style>      
     
            <!-- ContextMenu -->      
            <Style TargetType="ContextMenu" x:Key="ContextMenuStyle">      
    ...      
    </style>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                Cmenu = new System.Windows.Controls.ContextMenu();   
                Cmenu.Style = (Style)this.FindResource("ContextMenuStyle");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                System.Windows.Controls.MenuItem MIQuitter = new System.Windows.Controls.MenuItem();   
                MIQuitter.Click += new RoutedEventHandler(MIQuitter_Click);   
                MIQuitter.Header = "Quitter";   
                MIQuitter.Height = 20;   
                MIQuitter.Style = (Style)this.FindResource("MenuItemStyle");

Discussions similaires

  1. Déterminer la position d'un UserControl dans une Form
    Par Delphi-ne dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 25/11/2007, 13h59
  2. Notion UserControl dans JSF
    Par Verboz dans le forum JSF
    Réponses: 1
    Dernier message: 03/04/2007, 14h39
  3. [C# 1.1] - UserControl dans Internet Explorer
    Par Erakis dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/08/2006, 21h10
  4. [C#] Usercontrol dans usercontrol -> pb compilation
    Par annalady dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/04/2006, 15h38
  5. [VB.NET]Afficher plusieurs UserControls dans un Panel
    Par Golzinne dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/02/2006, 21h29

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