2008-11-16 7 views
2

J'ai un UserControl dessiné par le propriétaire dans lequel j'ai implémenté le double-buffering. Afin d'obtenir une double mémoire tampon pour travailler sans scintillement, je dois passer outre l'événement OnPaintBackground comme ceci:Contrôle de l'apparence du concepteur de UserControl en double-buffered dessiné par le propriétaire dans C#/.NET 2.0

protected override void OnPaintBackground(PaintEventArgs e) 
{ 
    // don't even have to do anything else 
} 

Cela fonctionne très bien à l'exécution. Le problème est que lorsque j'ai une instance du contrôle sur un formulaire au moment du design, il devient un trou noir qui montre les traces de toutes les fenêtres qui sont déplacées dessus (parce que le contour de l'événement OnPaintBackground gouverne aussi l'apparence au moment du design). C'est juste un problème esthétique, mais c'est visuellement discordant et cela amène toujours les nouveaux développeurs sur le projet à supposer que quelque chose a horriblement mal tourné.

Est-il possible d'avoir une méthode surchargée comme celle-ci ne pas être remplacée au moment de la conception, ou existe-t-il une autre solution?

+0

Y at-il une raison quelconque, vous ne pouvez pas utiliser le haut-tampon double? –

+0

Oui - cela ne fonctionne pas. Si vous créez un contrôle utilisateur avec DoubleBuffered = true, puis effectuez un tas d'opérations de dessin dessus, vous obtiendrez un scintillement. Je ne suis vraiment pas sûr de ce que cette propriété fait même. – MusiGenesis

Répondre

3

La solution de Steven Lowe couvre malheureusement tous les scénarios, en particulier lorsque les commandes utilisateur entrent en ligne de compte.

L'indicateur this.DesignMode est très décevant. Sa seule portée est de vérifier si le parent direct est dans le concepteur.

Par exemple, si vous avez un formulaire A, et un UserControl B, dans le concepteur:

  • A.DesignMode est vrai lorsque vu dans le concepteur
  • B.DesignMode est faux lors de l'affichage A, mais vrai en regardant directement B dans le concepteur.

La solution est un drapeau spécial pour vérifier (désolé pour le code laid C++):

if(this->DesignMode || 
    LicenseManager::UsageMode == LicenseUsageMode::Designtime) 
    return; 

Cette variable affichera toujours le bon booléenne de conception.

+0

Malheureusement, vous avez raison avec votre solution. J'ai d'abord essayé la solution de Steven Lowe et j'ai rencontré les problèmes que vous avez décrits. +1 pour vous – Marcel

+0

Comment diable puis-je mettre du code dans un commentaire! J'ai trouvé un moyen beaucoup plus puissant de détecter la détection du temps de conception. J'ajoute la propriété suivante à pratiquement toutes les formes \ usercontrol que je conçois, et fonctionne même correctement dans les constructeurs \ destructeurs, qui sont de vraies régions problématiques pour le concepteur. __ propriété bool IsDesignMode { bool get() { retour ( this-> DesignMode == true || LicenseManager :: UsageMode == LicenseUsageMode :: DesignTime || :: AppDomain CurrentDomain-> FriendlyName- > Est égal à (L "DefaultDomain")); } } – greggorob64

2
if (this.DesignMode) 
{ 
    return; //or call base.OnPaintBackground() 
} 
+0

Malheureusement, votre solution ne fonctionne pas dans tous les cas, voir le post de greggorob64. J'ai d'abord eu des problèmes en utilisant votre code. -1, désolé. – Marcel

2

La solution de greggorob64 en C#:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{ 
    return; 
} 
Questions connexes