2009-01-27 7 views
6

Disons que j'ai un contrôle et que je veux l'empêcher d'être édité.Comment désactiver .net Winforms Controls sans changer leur apparence?

La définition de la propriété Enabled du contrôle sur False fonctionnera, mais l'apparence du contrôle changera en conséquence, généralement dans une police noire sur gris difficile à lire. Quand la lisibilité est toujours importante, c'est un vrai problème.

Pour une zone de texte, il y a quelques corrections évidentes:

Textbox1.BackColor = Color.White; 

ou

Textbox1.ReadOnly= true; // instead of setting Enabled to false 

mais malheureusement, cela ne fonctionnera pas pour tous les contrôles (par exemple boutons radio)

Une autre solution est de laisser la propriété Enabled intacte, et de vous abonner à l'événement focus comme ceci (mais ce n'est pas une solution vraiment élégante)

this.Textbox1.Enter += new System.EventHandler(this.Textbox1_Enter); 

    private void Textbox1_Enter(object sender, EventArgs e) 
    { 
     Textbox1.FindForm().ActiveControl = null; 
    } 

Avez-vous vu d'autres façons de résoudre ce problème? (et je veux dire les solutions du monde réel, bien sûr, vous pouvez capturer une capture d'écran du contrôle et afficher la copie sur le contrôle ...: p)

Répondre

3

Il y a un argument selon lequel interférer avec le comportement standard de Windows est déroutant pour l'utilisateur, mais cela mis à part, j'ai déjà vu cela précédemment, bien que plus souvent en C++. Vous pouvez sous-classer le contrôle et gérer les messages de peinture vous-même. Lorsque le contrôle est activé, il suffit de déléguer le dessin à la classe de base. Lorsque le contrôle est désactivé, vous pouvez soit laisser la classe de base se dessiner et ensuite faire un dessin personnalisé sur le dessus ou vous pouvez simplement dessiner tout le truc vous-même. Je recommande fortement la première de ces options.

0

Certaines commandes peuvent être définies sur ReadOnly ce qui les laisse activés, mais incapable de être changé. C'est peut-être ce que vous cherchez.

Cela dit, vous allez probablement être un monde de douleur lorsque vos utilisateurs commencent à arriver confus car il semble qu'ils devraient pouvoir modifier les commandes, mais ils ne peuvent pas. Il y a une raison pour laquelle ils changent leur apparence visuelle - c'est de communiquer l'état du système à l'utilisateur. Mess avec cela et ils peuvent finir très confus.

+0

J'ai posté avant que j'en ai fini avec la question. –

+1

ahah! Encore un autre sniper de réputation :) – Brann

0

Si un contrôle est désactivé/en lecture seule, il doit vraiment apparaître désactivé/en lecture seule. Sinon, vous allez complètement confondre l'utilisateur.

Il y a de très bonnes raisons pour lesquelles les contrôles de Windows se comportent comme ils le font et que vous voulez vraiment rester cohérent avec les autres fenêtres interfaces là-bas. Lorsque quelqu'un utilise une application Windows, il a certaines attentes quant à son apparence et à son comportement.

Si vous déviez de ces attentes alors plus souvent qu'autrement, l'utilisateur va penser que votre logiciel est un morceau de ferraille.

+1

Je suis globalement d'accord avec votre point de vue, MAIS dans certains cas, vous voulez vraiment désactiver le contrôle sans altérer son apparence (surtout parce que le look 'désactivé' est souvent difficile à lire). C'est pourquoi la propriété ReadOnly est intégrée dans le framework pour certains contrôles, n'est-ce pas? – Brann

+1

Oui, et la propriété en lecture seule provoque également une modification visuelle du contrôle. Il s'agit simplement d'un changement visuel différent. –

0

Normalement, Oui, vous ne souhaitez pas modifier le comportement par défaut de Windows.

Mais j'ai un cas où je suis de nombreux contrôles sur la désactivation d'une page, généralement pour moins d'une seconde, afin d'éviter des problèmes inter-threads dans une application multi-thread. Cela provoque des problèmes de scintillement majeurs lors du passage d'un utilisateur, par exemple une vue arborescente ou une liste. Ne pas changer leur apparence dans ce cas est une chose souhaitable.

Cependant, lorsque les contrôles sont désactivés pour d'autres raisons, je souhaite que leur apparence reflète leur état activé/désactivé. Le scintillement des états activé/désactivé dans le cas où ce n'est qu'une chose momentanée a pour résultat une perception beaucoup plus négative du logiciel plus que la suppression du changement d'apparence pour les contrôles désactivés afin d'éviter le clignotement de nombreuses parties de la forme serait.

Questions connexes