Question

J'ai formulaire personnalisé , hérité de Form , qui implémente une propriété booléenne nommée Prop . Les formulaires que je vais utiliser hériteront de CustomForm . Cette propriété va peindre et modifier (si elle est activée) le formulaire. Cependant, cela ne fonctionne pas comme il se doit, le VS IDE conçu n’est pas actualisé pour afficher les modifications. Mais si j'appuie sur Ctrl + Maj + B (Menu: Construire »Construire la solution), l'IDE de VS s'actualisera, le concepteur de formulaire disparaîtra même pendant une fraction de seconde et se redessinera avec les nouvelles modifications appliquées.

Alors, y a-t-il un moyen, par code, de forcer le concepteur de VS IDE à se rafraîchir comme cela se produit lorsque je crée la solution? Si tel est le cas, je pourrais ajouter ce code à l'accesseur Prop et mon problème a disparu.

Notez que j'ai essayé d'appeler Invalidate (), Refresh () et Update. Mais aucun d’entre eux ne semblait régler le problème ...

Voici un aperçu de mon vrai problème. Mon code ressemble à ceci:

internal class MyForm : Form {
    private FormBorderStyle formBorderStyle;
    private bool enableSkin;

    [DefaultValue(false)]
    public bool EnableSkin {
        get {
                return enableSkin;
        } set {
                enableSkin = value;

                if(enableSkin) {
                        BackColor = Color.Lime;
                        MaximizedBounds = Screen.GetWorkingArea(this);
                        TransparencyKey = Color.Lime;

                        base.FormBorderStyle = FormBorderStyle.None;
                } else {
                        BackColor = SystemColors.Control;
                        MaximizedBounds = Rectangle.Empty;
                        TransparencyKey = Color.Empty;

                        base.FormBorderStyle = FormBorderStyle;
                }
        }
    }

    [DefaultValue(FormBorderStyle.Sizable)]
    public new FormBorderStyle FormBorderStyle {
        get {
                return formBorderStyle;
        } set {
                formBorderStyle = value;

                if(EnableSkin) {
                        base.FormBorderStyle = FormBorderStyle.None;
                } else {
                        base.FormBorderStyle = formBorderStyle;
                }

        }
    }

    internal MyForm() {
        EnableSkin = false;
        FormBorderStyle = FormBorderStyle.Sizable;
    }
}

Et le problème que je rencontre est quelque chose comme ceci: http://blogs.msdn.com/calvin_hsia/archive/2007/05/01/windows-vista-aero-borderstyle-paint-problem-as -non-administrator.aspx

Dans mon cas, cela se produit lorsque vous définissez EnableSkin sur True, le redéfinissez sur False, puis le changement de FormBorderStyle provoquera le problème que vous pouvez voir sur le lien ci-dessus. Comme indiqué dans l'article, le problème ne survient pas lors de l'exécution de VS en tant qu'administrateur.

C'est pourquoi je cherche un moyen de rafraîchir le concepteur VS IDE. En d’autres termes, maintenant que j’ai trouvé cet article, j’ai besoin de recréer la fenêtre comme cela se produit lors de la reconstruction de la solution.

Comment déclarer une propriété dans le formulaire de base?

J'ai actuellement:

public class MyForm : Form { }

Et je ne peux déclarer que des propriétés à l'intérieur de cette classe, pas à l'intérieur du premier formulaire ... J'ai également utilisé Invalidate () comme je l'ai dit dans le premier message, mais cela ne résout pas mon problème.

Était-ce utile?

La solution

Quelqu'un m'a aidé et résolu le problème. J'appelle simplement ReCreateHandle () lorsque l'utilisateur définit EnableSkin sur false. Problème résolu:)

Merci à tous cependant:)

Autres conseils

Il suffit d’ajouter cet attribut à votre propriété:

 [Description("Description of your property."), NotifyParentProperty(true),
 RefreshProperties(RefreshProperties.Repaint)]

Cela entraînera une nouvelle peinture de l'EDI lorsque la valeur sera modifiée.

Pour autant que je sache, les routines de peinture ne sont pas reflétées dans l'EDI si vous montrez l'objet qui peint. Par exemple, si votre formulaire de base peint un peu, l'héritage indique que ... mais si vous ouvrez le formulaire de base, il n'affiche pas le résultat du dessin.

Je pense que si vous devez afficher le résultat de la modification de la propriété de vos formulaires enfants, cette propriété doit être déclarée sous forme de base et peindre sous cette forme.

En passant ... dans le corps de la propriété, vous devez appeler this.Invalidate () afin d'actualiser le dessin.

J'espère que ça aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top