J'ai écrit un contrôle personnalisé en C# qui hérite de RichTextBox. Le but de ce contrôle est de contenir toutes les améliorations et modifications, telles que la modification de la numérotation des lignes et le fait que le contrôle ne se répète que lorsqu'il le devrait.Comment remplacer une propriété héritée de RichTextBox?
Hier, j'ai remarqué des pics de mémoire (et souvent, des exceptions de MOO) lors de l'accès à la propriété Lines de ce contrôle (il y a parfois plus de 600 000 lignes dans le contrôle). J'ai codé des solutions de contournement qui ne l'impliquent plus, mais j'aimerais quand même l'enlever complètement pour que les personnes qui utilisent mon contrôle à l'avenir ne l'utilisent pas.
La propriété Lines est System.Windows.Forms.TextBoxBase.Lines. Idéalement, j'aimerais que la chaîne [] pour cette propriété ne soit jamais touchée; quand je charge du texte dans le contrôle, je ne veux pas que le contrôle fasse quoi que ce soit pour remplir cette propriété de lignes (parce que c'est complètement inutile et qu'il consomme du temps et des ressources).
Vous avez des idées?
EDIT: J'ai essayé
public override string[] Lines { get { return null; } set { ; } // do nothing }
Mais VS dit « ne peut pas passer outre System.Windows.Forms.TextBoxBase.Lines.get membre hérité parce qu'il est pas marqué virtuel, abstrait, ou override
. Donc, il semble que je ne peux pas le contourner ou le supprimer Je pense que la RichTextBox est en train de définir la propriété car elle est remplie après le changement du texte Y at-il un moyen de capturer et de traiter ce message?
+1 a supprimé ma réponse upvoted, je pense que c'est une bien meilleure réponse. – GenericTypeTea
"La propriété Lines devrait être utile à tous ceux qui utilisent votre éditeur, elle couvre le besoin fondamental de pouvoir récupérer le texte qui a été édité." Eh bien, généralement, l'utilisateur ne modifiera pas le texte. Le contrôle est conçu principalement pour la visualisation avec un tas de petites fonctionnalités (mise en forme de certains textes, etc). Chaque fois que le programme a besoin de la ligne en cours, j'utilise une variable temp commençant au SelectionStart et revenant à la ligne précédente.Je concatène ensuite les chaînes jusqu'au prochain saut de ligne. C'est plus rapide que d'appeler editor.Lines [GetLineFromCharIndex (editor.SelectionStart)]. – Kizaru
En outre, l'utilisation de la mémoire ne crache pas lors de ma solution de contournement. J'ai passé des semaines il y a quelques mois à essayer de trouver un meilleur éditeur, mais ils avaient tous d'énormes problèmes. Le seul problème de ScintillaNET était une fuite de mémoire (qui a conduit à OOM) lors de la modification du texte. Bien que ce projet soit fait et considéré comme plus que satisfaisant, j'aimerais toujours trouver des façons de l'améliorer :) – Kizaru