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

C#.NET中可滚动控件的最佳实践方法,c#,.net,custom-controls,scrollable,C#,.net,Custom Controls,Scrollable,我正在设计一个用于语法编辑的windows窗体控件。我知道已经有很多了,比如,r,等等。我有理由设计自己的,所以这不是问题所在 到目前为止,我一直在设计的外观和感觉的控制。它需要能够控制垂直和水平方向 我遇到的选择是: 我的控制权延伸或延伸 我的控件实例化和控件,并相应地放置它们 我的控件用于自定义绘制滚动条 我不确定这些选项中的哪一个是我控制的最佳实践 我尝试使用and,但这有一些非常不想要的结果,可能是因为控件DisplayRectangle正在滚动…我不想要这样。我想滚动一个保存文本的自定

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

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

我遇到的选择是:

  • 我的控制权延伸或延伸
  • 我的控件实例化和控件,并相应地放置它们
  • 我的控件用于自定义绘制滚动条
  • 我不确定这些选项中的哪一个是我控制的最佳实践

    我尝试使用and,但这有一些非常不想要的结果,可能是因为控件
    DisplayRectangle
    正在滚动…我不想要这样。我想滚动一个保存文本的自定义矩形

    我试着实例化HScrollBar和VScrollBar,但这似乎有很多问题,不能很好地与focus配合使用,并且我无法确定如何正确捕获VScroll和HScroll事件

    我尝试过使用,但是仅仅为了实现一个滚动条,这似乎需要花费大量的精力,使用这种方法,我仍然需要捕获并适当地处理事件


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

    滚动条排序器仅用于绘制滚动条,它实际上不执行任何滚动计算或操作

    就我个人而言,我发现HScrollBar和VScrollBar控件相当笨拙

    从ScrollableControl(或获取内置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控件来实现这一点。

    如果您过早陷入困境,接下来的41个问题将更难解决。滚动条实际上不会滚动任何东西,它只是告诉你从哪里开始画画。轮子发明者是最好的!谢谢你的回答。我以前肯定从未探索过TranslateTransform方法……所以我将尝试一下。就使用RichTextBox而言,我已经看到许多使用此功能的实现,但是当您达到合理的文件大小(比如1000行)时,它们都非常慢。另外,RichTextBox不支持行号、视觉提示、代码折叠等,这些都是我打算实现的功能。我知道有一些像斯金特拉,但即使是这些都缺乏一些方面!