2012-01-10 3 views
0

J'utilise CAB et infragistics dans l'application winforms, sous une forme que j'ai des séparateurs et des contrôles utilisateur avec des grilles, des boutons, des étiquettes ... à l'intérieur de ce splitter est ouvert dans l'exécution, les contrôles de l'utilisateur ne sont pas peints correctement, ce problème est connu pour win7 x64 comme décrit ici controls inside Split Container paint issue on Windows 7 et ici this archive link from the Component Factory website cache. La solution fournie dans les rubriques ci-dessus se composent de substituant la méthode OnSizeChanged:Contrôles à l'intérieur du problème de peinture de conteneur de fractionnement sur win7 x64 en utilisant CAB

protected override void OnSizeChanged(EventArgs e) 
    { 
     if (Handle != null) 
      BeginInvoke((MethodInvoker)delegate 
      { base.OnSizeChanged(e); }); 
    } 

le problème avec cette solution pour l'utilisation de l'ACR que cette méthode est appelée lors de l'initialisation des composants de formulaire de constructeur (InitializeComponent appelé de constructeur) et la méthode OnLoad est appelée lorsque la propriété de la poignée est accessible car il est créé si sa valeur est nulle,

protected override void OnLoad(EventArgs e) 
    {    
     _presenter.OnViewReady(); 
     base.OnLoad(e);    
    } 

ici, le _presenter n'est pas encore défini et sa valeur est nulle et une axception est levée.

Que puis-je faire pour résoudre ce problème?

Cordialement.

Répondre

1

Une solution simple peut être d'avoir un champ (_isInitilizeCompleted) pour indiquer si la méthode InitilizeComponent a terminé et modifier la méthode OnSizeChanged être comme suit:

protected override void OnSizeChanged(EventArgs e) 
{ 
    if (Handle != null && _isInitilizeCompleted) 
     BeginInvoke((MethodInvoker)delegate 
     { base.OnSizeChanged(e); }); 
} 

Je ne l'ai pas testé, mais il devrait fonctionner , sauf si OnSizeChanged doit bien sûr être appelé pendant InitializeComponent.

0

L'idée d'utiliser un drapeau fonctionne bien! le test d'indicateur doit être effectué avant de tester la propriété Handle:

protected override void OnSizeChanged(EventArgs e) 
    { 
     if (_isInitilizeCompleted && Handle != null) 
      BeginInvoke((MethodInvoker)delegate 
      { base.OnSizeChanged(e); }); 
    }