c# . net中可滚动控件的最佳实践方法

本文关键字:最佳 方法 控件 net 滚动 | 更新日期: 2023-09-27 17:54:03

我正在设计一个windows窗体控件的语法编辑。我知道已经有很多了,像Scintilla, FastColoredTextBox, Actipro语法编辑器,Avalon编辑器等。我有自己设计的理由,所以这不是问题。

到目前为止,我一直在设计控件的外观和感觉。它需要能够控制垂直和水平。

我遇到的选项有:

  1. 我的控件扩展了ScrollableControl或ContainerControl
  2. 我的控件实例化了HScrollBar和VScrollBar控件,并相应地放置了它们
  3. 我的控件使用ScrollBarRenderer自定义绘制滚动条

我不确定这些选项中哪一个是我控制的最佳实践。

我尝试使用ScrollableControl和ContainerControl,但这有一些非常不希望的结果,可能是因为控件DisplayRectangle正在滚动…我不想这样。我想滚动一个包含文本的自定义矩形。

我尝试实例化HScrollBar和VScrollBar,但这似乎非常错误,并没有很好地工作与焦点,我无法找出如何正确捕获VScroll和HScroll事件。

我尝试使用ScrollBarRenderer,但这似乎只是为了实现一个滚动条而付出了很多努力,并且使用这种方法,我仍然需要适当地捕获和处理事件。

那么我应该使用哪一种方法,或者我可能忽略了哪一种方法呢?

c# . net中可滚动控件的最佳实践方法

ScrollBarRenderer仅用于绘制滚动条,它实际上并不执行任何滚动计算或操作。

就我个人而言,我发现HScrollBar和VScrollBar相当笨拙的控制工作。

从ScrollableControl(或Panel以获得内置的窗口控件边框)继承可能是最简单的。使用AutoScrollMinSize属性来设置内部表面的大小,然后使用AutoScrollPosition属性对图形对象执行TranslateTransform来处理绘制控件部分的"位置":

public class ScrollControl : ScrollableControl {
  public ScrollControl() {
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
    this.AutoScrollMinSize = new Size(0, 600);
  }
  protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    e.Graphics.Clear(Color.White);
    e.Graphics.TranslateTransform(this.AutoScrollPosition.X, 
                                  this.AutoScrollPosition.Y);
    e.Graphics.FillRectangle(Brushes.Red, new Rectangle(16, 32, 64, 32));
  }
}

要小心,语法文本编辑器与绘图控件是不同的。我建议使用RichTextBox控件