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

标签 c# .net custom-controls scrollable

我正在设计一个用于语法编辑的 Windows 窗体控件。我知道已经有很多了,比如 Scintilla , FastColoredTextBox , Actipro Syntax Edito r,Avalon Edit等等。我有自己设计的理由,所以这不是问题。

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

我遇到的选项是:

  1. 我的控制范围扩大 ScrollableControlContainerControl
  2. 我的控件实例化了 HScrollBarVScrollBar控制并相应地放置它们
  3. 我的控件使用 ScrollBarRenderer自定义绘制滚动条

我不确定这些选项中哪一个最适合我的控制。

我尝试使用ScrollableControlContainerControl ,但这会产生一些非常不想要的结果,可能是因为控件 DisplayRectangle 正在滚动......我不想要这个。我想滚动一个包含文本的自定义绘制矩形。

我尝试实例化 HScrollBar 和 VScrollBar,但这似乎有很多错误,并且不能很好地聚焦,而且我无法弄清楚如何正确捕获 VScroll 和 HScroll 事件。

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

那么我应该使用这些方法中的哪一种,或者实际上是我可能忽略的方法?

最佳答案

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

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

从 ScrollableControl(或 Panel 以获得内置 Windows 控件边框)继承可能是最简单的。您可以使用 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 控件。

关于c# - C# .NET 中可滚动控件的最佳实践方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14396964/

相关文章:

c# - ContractData : returning a type of 'T' from the exception handler 的通用反序列化

c# - Asp.net C# 用 "a href"链接替换字符串的所有 url

c# - Socket ObjectDisposed 异常

c# - 什么能在 .NET 2 上运行,什么不能运行?

custom-controls - 单击带有 WATIR WebDriver 的按钮

JavaFX 自定义控件<T> : Is this possible?

c# - 通过 REST API C# 打印装箱单 "No Address Provided"

c# - .net ExternalSigninAsync MissingMethodException 系统.Threading.tasks

c# - 如何使用反射来确定数组的嵌套类型(元素类型)?

macos - OSX 中的自定义 slider