カスタムC#TreeViewに取り組んでおり、ノードの名前に表示されるキーワードを強調表示するためにカスタム描画を実行したいと思います。
やった :
DrawMode = TreeViewDrawMode.OwnerDrawText;
カスタムTreeViewのコンストラクターで、OnDrawNodeをオーバーライドします。
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
if (!e.Node.IsVisible) { return; }
if (e.Node.Bounds.IsEmpty) { return; }
e.DrawDefault = false;
...draw calls...
しかし、私がこのようにコーディングした後、それは奇妙に機能しました、知覚された振る舞いは以下を含みます:
- 展開されていない子ノードで呼び出されているOnDrawNode
- TreeViewのコンテンツが更新されると、ユーザーは古いコンテンツと新しいコンテンツが同時に重なり合って表示されます。古いコンテンツは、約0.5秒以上になるまで消えません。
- レンダリング速度は、元の描画呼び出しよりもはるかに遅くなります。
私が行ったもう1つの変更は、TreeViewの更新時に発生するちらつきを抑制するためにここで見つけたコードスニペットです。http: //dev.nomad-net.info/articles/double-buffered-tree-and-list-views しかし、削除した後もテキストが重なっているのが見えるので、問題に直接関係していません。
誰かがこの問題について何か考えを持っているのだろうか?
どんな考えでもいただければ幸いです。ありがとうございました。
編集:
OnDrawNodeのコンテンツは次のようになります。
string pattern = keyword;
if (!string.IsNullOrWhiteSpace(pattern))
{
Regex regularExpressionnew = Regex(pattern);
Match match = regularExpression.Match(e.Node.Text);
while (match.Success)
{
CaptureCollection captureCollection = match.Groups[0].Captures;
foreach (Capture capture in captureCollection)
{
int highlightStartIndex = capture.Index;
int highlightEndIndex = capture.Index + pattern.Length;
e.Graphics.FillRectangle(nodeHightLightColor, GetTextBoundsBetweenIndex(e.Graphics, e.Node.Text, highlightStartIndex, highlightEndIndex, e.Bounds));
}
match = match.NextMatch();
}
Brush drawBrush = new SolidBrush(Color.Black);
e.Graphics.DrawString(e.Node.Text, Font, drawBrush, e.Bounds);
GetTextBoundsBetweenIndexは、基本的に、highlightStartIndexとhighlightEndIndexの間の文字をカバーする正方形の領域を計算しています。
ただし、正規表現がコメント化され、テキストレンダリングのみが残った場合、ラグとオーバーラップが発生します。