[英]How do I only repaint a special area?
我的英語水平很差,因為我不是母語人士。
我寫了一個編輯器,它具有像 Highlight 一樣的視覺效果。 編輯器具有用於表示視覺效果的 DrawingControl,如下代碼所示。
public class HighlightTextBox : TextBox
{
private DrawingControl renderCanvas;
}
public class DrawingControl : FrameworkElement
{
private VisualCollection visuals;
private DrawingVisual visual;
public DrawingControl()
{
visual = new DrawingVisual();
visuals = new VisualCollection(this);
visuals.Add(visual);
}
public DrawingContext GetContext()
{
return visual.RenderOpen();
}
protected override int VisualChildrenCount
{
get { return visuals.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= visuals.Count)
throw new ArgumentOutOfRangeException();
return visuals[index];
}
}
如果用戶在編輯器上輸入字符,則調用 TextChanged 事件。 之后,通過調用 InvalidateVisual function 調用 OnRender function。
TextChanged(s,e)
{
InvalidateVisual();
}
然后使用 DrawingControl 中的 DrawingContext 繪制所有具有視覺效果的文本。
protected override void OnRender(DrawingContext drawingContext)
{
if (this.bSingleLineChanged)
{
this.SingleLineChangedRender(drawingContext);
this.bSingleLineChanged = false;
return;
}
else
this.AllRender(drawingContext);
}
private void AllRender(DrawingContext drawingContext)
{
// Calculate drawing position, texts, etc...
var dc = this.renderCanvas.GetContext();
// Here draw texts
dc.Close();
base.OnRender(drawingContext);
}
結果,當所有文本都被重新繪制時,繪制過程成功,但這種方式需要很多時間。 為了縮短繪圖時間,我嘗試只重新繪制更新的部分。 零件繪制過程在 SingleLineChangedRender function 中定義。 function 的邏輯也與 AllRender function 類似。
現在我要解釋一個問題。 我計算了一個更新的部分,並在 SingleLineChangedRender function 中編寫了邏輯。 但是當在 SingleLineChangedRender function 中調用 GetContext function 時,所有繪制的上下文都會被刪除。
private void SingleLineChangedRender(DrawingContext drawingContext)
{
// I think that here all drawn contexts are erased.
var dc = this.renderCanvas.GetContext();
// Here draw texts
dc.Close();
base.OnRender(drawingContext);
}
我只想重新繪制更新的部分,但我不能這樣做,因為當調用 GetContext function 時,所有上下文都會被刪除。
我想征求你的意見來解決這個問題。
感謝您的閱讀。
我聽從了您的建議,並通過更新 DrawingControl class 解決了這個問題。
我將 TextViewer class 更新為 DrawingContext 的容器。
結果,class 形成了以下。
public class TextViewer : FrameworkElement
{
// For highlighting of the selected line.
private DrawingVisual selectionLineAppearance = new DrawingVisual();
// For highlighting tokens of the lines.
private VisualCollection lines;
protected override int VisualChildrenCount
{
// selectionLineAppearance + lines
get { return 1+lines.Count; }
}
protected override Visual GetVisualChild(int index)
{
if (index < 0 || index >= VisualChildrenCount)
throw new ArgumentOutOfRangeException();
if (index == 0) return this.selectionLineAppearance;
return lines[index-1];
}
// logices
...
}
現在,編輯器只能重繪更新的部分。 加法可以繪制所選線的外觀。
感謝您的意見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.