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 Forms Discussion :

[C#]Bloquer le redimensionnement d'un usercontrol


Sujet :

Windows Forms

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut [C#]Bloquer le redimensionnement d'un usercontrol
    Bonjour,

    Je voudrais savoir comment empêcher un utilisateur de modifier une des dimensions (ou les 2) d'un usercontrol, en ne faisant pas apparaître les poignées en mode design.

    Pour prendre un exemple : le textbox en mode "non-multiligne" ne fait pas apparaître la poignée de redimension en hauteur, l'utilisateur ne peut modifier que la largeur.
    Par contre, dès qu'on sélectionne le multiligne, la poignée apparaît.

    Je peux bloquer la redimension dans le code du usercontrol (je le force à revenir à la bonne dimension), mais je trouve ça peu élégant.

    Merci d'avance,
    Claude

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est peu élégant certes mais ca reste simple à écrire

    l'autre méthode c'est de créer une classe designer et de l'attribuer à ton usercontrol


    en effet le mode design de vs est codé en .net par une classe héritant de controldesigner si mes souvenirs sont bons
    cette classe s'occupe d'afficher les points d'ancrages (qui sont des glyphs dans le jargon du designer) qui servent à redimensionner le controle en mode design
    cette classe gère aussi ce qu'on appelle les smart tags, le déplacement, le drag drop etc... où d'ajouter tout ce qu'on peut imaginer pour gagner en souplesse ou en rapidité en mode design
    un smart tag on en trouve sur quelques controles, c'est la petite flèche en haut à droite ; comme le textbox qui permet de passer en mode multiligne par exemple
    sur un smart tag on peut mettre des propriétés souvent utilisés ou des liens vers des sub

    mais ca reste donc moins simple
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    (désolé c'est du vb.net mais il existe des traducteurs vb.net c#)
    il faut ajouter system.design en référence au projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <System.ComponentModel.Designer(GetType(UserControl1Designer))> _
    Public Class UserControl1
     
    End Class
     
     
    Friend Class UserControl1Designer
        Inherits System.Windows.Forms.Design.ControlDesigner
     
        Public Overrides Function GetGlyphs(ByVal selectionType As System.Windows.Forms.Design.Behavior.GlyphSelectionType) As System.Windows.Forms.Design.Behavior.GlyphCollection
            Return MyBase.GetGlyphs(selectionType)
        End Function
    End Class
    la fonction getglyphs s'occupe de retourner la liste des glyphs à afficher selon le mode de selection (non sélectionné, sélectionné primaire etc...)
    en l'overridant on peut donc choisir lesquels seront affichés (ici suite à l'appel à mybase (base en c#) on voit que 12 glyphs sont générés)
    ensuite soit retirer les quelques uns qui te gène, soit ne pas appeler base et ne créer que ceux que tu veux (voir aucun peut etre que ca peut convenir)

    pour savoir lesquels créer et comment les créer, il faut regarder dans reflector je pense

    NB : le mode design et débuggable en pas à pas comme le mode execution, ce qui est pratique pour ce genre de chose
    méthode : propriétés du projet, onglet débugger, choisir démarrer un exe, chercher devenv.exe (vs) puis dans le nouveau vs ouvert rouvrir la meme solution, les points d'arret dans le 1er vs fonctionne alors


    à voir dans le même registre : il est aussi possible de créer des classes editeurs, utilisable dans le propertygrid (de vs ou à l'execution) ainsi que dans les smarttag si on y a mit des propriétés
    pour une propriété string, ca laisse remplir, il n'y a pas d'éditeur
    pour certaines propriétés c'est une liste déroulante qui est proposée, et pour d'autres c'est meme un usercontrol ou un form qui s'affiche (propriété anchor par exemple)
    il est donc possible d'en créer pour ses propres propriétés
    pour ca il faut hériter de System.drawing.Design.UITypeEditor
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Bon, j'ai fait quelques essais avec la méthode que tu me donnes (merci).

    Effectivement, si je supprime un glyphe de la collection (glyphe.removeAt(index)), ou si je retourne null, les poignées disparaissent.

    Mais en fait, quelque soit le glyphe supprimé, je ne sais plus non plus déplacer mon contrôle, il est figé. De plus, je ne trouve pas comment les identifier pour savoir celui qui est concerné.

    Le second problème, c'est qu'une fois que j'ai fait ça, ce n'est pas seulement mon usercontrol qui se retrouve bloqué, mais n'importe quel contrôle standard que j'ajoute sur ma fenêtre de test : la méthode agit sur tous les contrôles placés sur la fenêtre.

    Enfin, dès que j'ai obtenu ce "blocage", il est impossible de faire marche arrière, même en rétablissant la méthode correctement et en recompilant, ni même en supprimant le contrôle sur la fenêtre test et en le replaçant à nouveau : je suis obligé de quitter VS puis le relancer et recharger mon projet, et alors ça refonctionne.

    Une idée?

    Claude

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    normalement il suffit de recompiler pour remettre le fonctionnement

    et ca métonne vraiment que le fonctionnement agisse sur tous les controles ! j'ai fais pas mal de designer sans soucis (enfin pas retirer des glyph ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    En fait, je suis tombé sur le net sur des posts d'internautes qui ont rencontré le même problème : certains disent même : ça ne fonctionne qu'à la première compilation, ensuite on est contraint de quitter et relancer VS pour pouvoir faire des modifications (peut-être qu'ils font une erreur identique à celle que je fais, je l'ignore).

    Bon, ceci étant, après avoir modifié une dizaine de fois, ça a carrément fini par planter mon projet : j'obtiens des warning qui m'indiquent que la form "form1" (ma bête fenêtre de test) est en conflit avec une valeur importée (??). Si je supprime la form et que je la recrée, VS me propose le nom "form2", ce qui est symptomatique. Et ce, malgré que j'ai vérifié qu'il ne reste strictement aucune référence à "form1" dans toute la solution. Et si j'insiste, le nombre de warnings augmente.

    Bref, j'ai du recréer un nouveau projet et y recopier mon user-control pour que ça refonctionne.

    A partir de ce tout nouveau projet, je recommence la manoeuvre :

    J'écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        internal class UserControl1Designer : System.Windows.Forms.Design.ControlDesigner
        {
            public override System.Windows.Forms.Design.Behavior.GlyphCollection GetGlyphs(System.Windows.Forms.Design.Behavior.GlyphSelectionType selectionType)
            {
                var glyphes = base.GetGlyphs(selectionType);
                //glyphes.RemoveAt(11);
                return glyphes;
            }
        }
    Et tout fonctionne correctement pour mon user-control et pour tout autre contrôle placé sur la fenêtre qui me sert de test (dans le même projet). Logique, en fait je ne fais rien de concret.

    J'enlève ensuite les "//" devant glyphes.RemoveAt(11)" (même résultat quel que soit l'index, j'en ai essayé plusieurs), et je recompile.
    Je reviens dans le designer de la fenêtre servant de test (form1) :
    Si j'avais un usercontrol déjà placé, la fenêtre disparaît complètement du designer, la page est blanche et vide.
    Sinon, ma fenêtre y est et correcte.
    J'y place un usercontrol, et plus rien du designer ne fonctionne, et si je tente de déplacer le contrôle, j'obtiens un symbole "sens interdit".
    J'y ajoute un textbox ordinaire : pareil, impossible à déplacer et plus rien ne fonctionne (pas de poignées, pas de déplacement, etc).

    Je reviens dans le code de l'user-control, et je replace les commentaires (je suis revenu au point de départ). Je recompile... et rien ne change, mon user control et mon textbox restent non déplaçables. Idem si je les détruits et que je les replace.

    Je ferme VS, je le réouvre, et ça refonctionne.

    J'ai fait des recherches sur le net, je n'ai rien trouvé comme tuto sur le designer et sur les glyphes, mais apparemment la méthode consistant à "virer" un des glyph produit des résultats curieux.

    Claude

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Bon, après avoir travaillé sur autre chose, je suis revenu sur ce point.
    En fait, la solution est très très simple, je la donne si ça peut dépanner quelqu'un :

    1) On dérive son propre designer de sa classe (méthode habituelle)

    2) On surcharge simplement la propriété SelectionRules comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public class MonDesigner : ControlDesigner
        {
            //--------------------------------------------------------------------------------------------
            /// <summary>Autorise le redimensionnement en largeur uniquement et le déplacement</summary>
            //--------------------------------------------------------------------------------------------
            public override SelectionRules SelectionRules
            {
                get
                {
                    return SelectionRules.LeftSizeable | SelectionRules.Moveable | SelectionRules.RightSizeable;
                }
            }
    Et ça fonctionne parfaitement, on peut bloquer ou autoriser ce qu'on veut



    Claude

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/10/2011, 11h31
  2. UI Dialog. Bloquer le redimensionnement
    Par DjChat dans le forum jQuery
    Réponses: 2
    Dernier message: 01/10/2010, 09h05
  3. Bloquer le redimensionnement d'un tableau
    Par Danger dans le forum Word
    Réponses: 4
    Dernier message: 26/09/2008, 21h20
  4. Réponses: 3
    Dernier message: 16/05/2008, 05h12
  5. bloquer le redimensionnement d'une fiche
    Par nkd dans le forum Composants VCL
    Réponses: 3
    Dernier message: 24/04/2006, 12h48

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