2010-11-12 4 views
0

dérivée que je dois faire une classe de base appliquer ceci:Empêcher les modifications à Form.FormBorderStyle en classe

public class DialogForm : Form 
{ 
    public DialogForm() 
    { 
     base.HelpButton = true;//enforce this 
     base.MinimizeBox = false;//enforce this 
     base.MaximizeBox = false;//enforce this 
    } 
} 

ET assurez-vous qu'il ne soit pas modifiée par la suite, comment cela peut-il être fait?

Je ne peux pas passer outre les propriétés MinimizeBox et MaximizeBox car ils ne sont pas virtuelles, si quelqu'un jette DialogForm comme Form contournera le code suivant:

new public bool MinimizeBox 
{ 
    get { return false; } 
    set { base.MinimizeBox = false; } 
} 

new public bool MaximizeBox 
{ 
    get { return false; } 
    set { base.MaximizeBox = false; } 
} 

Merci


Pour référence est ainsi ici pour le résoudre (merci à SLacks)

private bool m_inOnStyleChanged = false; 
protected override void OnStyleChanged(EventArgs e) 
{ 
    if (!m_inOnStyleChanged) 
    { 
     m_inOnStyleChanged = true; 
     base.OnStyleChanged(e); 
     base.HelpButton = true; 
     base.MinimizeBox = false; 
     base.MaximizeBox = false; 
     m_inOnStyleChanged = false; 
    } 
} 
+0

Vous pouvez également uniquement chaque propriété si elle est 'true' pour empêcher la récursivité. – SLaks

+0

@SLaks: En effet, et il serait préférable d'utiliser un drapeau global aussi ... merci encore. – smichaud

Répondre

1

Vous pouvez remplacer OnStyleChanged et définir les propriétés sur false.
Cette méthode est appelée (indirectement) par les setters de propriété.
Notez que ce ne sera pas nécessairement vrai dans les versions futures (bien qu'il sera probablement)

Vous devez également ajouter

[Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
[DesignerSerializationVisiblity(DesignerSerializationVisiblity.Hidden)] 

Cependant, il n'y a rien de mal à cacher simplement les propriétés.
Vous (probablement) ne devriez pas avoir peur que quelqu'un jette votre instance à Form et les définisse.
Vos clients sont-ils réellement hostiles?

+0

Ceci n'est appelé que lorsque SetStyle est utilisé - vous ne savez pas comment cela peut vous aider dans ce scénario. –

+0

@Jeff: Incorrect. Il est appelé par _property setter_ -> 'UpdateFormStyles' ->' UpdateStyles' -> 'OnStyleChanged'. J'ai vérifié la source. – SLaks

+0

@SLaks: Hmmm, c'est peut-être le cas, mais les docs ne le supportent pas - et je ne vois pas comment le fait de changer la capacité de maximiser ou de minimiser entraînera cet événement. –

0

Plusieurs options sont disponibles si vous souhaitez contrôler si votre fiche possède ces boutons ou non.

  1. Masquer les propriétés en utilisant le mot-clé new afin que vos versions sont vus et utilisés (ils pourraient encore utiliser les anciens par coulée à Form).

  2. Créez une nouvelle classe qui enveloppe une instance de Form et dont les utilisateurs dérivent. Cela nécessiterait un effort supplémentaire pour exposer tous les événements et les appels que vous voulez qu'ils puissent utiliser, mais cela vous donnerait un contrôle total sur ce qui peut et ne peut pas être fait avec le formulaire.

  3. Écoutez l'événement OnStyleChanged et vérifiez que ces propriétés ne changent pas. Cela dépend d'un détail d'implmentation non documenté, il est donc possible que les futurs frameworks .NET ne se comportent pas de cette manière.

  4. Laisser les boutons à apparaître, mais essayez de contrôler leurs effets sur votre formulaire. Vous ne pourrez peut-être pas contrôler si une dérivation affiche ou masque ces boutons, mais vous pourrez peut-être contrôler l'effet qu'ils ont sur votre formulaire. Cependant, c'est un peu désordonné. Vous pouvez probablement y parvenir en remplaçant certaines des méthodes de niveau inférieur telles que SetBoundsCore. Vous devez également regarder la propriété MaximizedBounds et le gestionnaire associé OnMaximizedBoundsChanged. En minimisant les résultats dans un événement Resize, vous devriez être en mesure de contrôler cela aussi.

+0

Ce 'Box', pas' Size'. – SLaks

+0

Je pense qu'ils peuvent au moins contrôler ce que ces boutons font, de sorte que même s'ils apparaissent, ils peuvent les empêcher de fonctionner. J'étudie toujours l'idée de ne pas permettre que ces valeurs changent. –

+0

Cela n'a rien à voir avec ses propriétés. – SLaks

Questions connexes