2010-02-21 4 views
4

Я не могу получить прокрутку, работающую в моем пользовательском элементе управления. В настоящее время он рисует собственный контент (на данный момент только сетку) и должен рассматриваться как имеющий большую область для работы. Однако я не могу заставить прокрутку работать.Пользовательский контроль и прокрутка, помощь?

С включенным AutoScroll я не могу запустить его в центре рабочей области.

С отключением AutoScroll я не могу получить значения полос прокрутки, чтобы зафиксировать их в коде или на самом деле прокручивать.

Чтобы справиться с этим, при использовании отдельных элементов управления HScroll и VScroll никакие полосы прокрутки вообще не отображаются.

Текущее состояние, которое код пытается отключить AutoScroll, но я нахожусь в точке, где я признаю, что не могу заставить его делать то, что я хочу, без помощи.

Так что, пожалуйста, помогите!

Вот код до сих пор:

public partial class TwoDimensionViewport : ScrollableControl 
{ 
    private readonly Point MinOffset = new Point(-4000000, -4000000); 
    private readonly Point MaxOffset = new Point(4000000, 4000000); 

    private Point viewOffset; 

    public TwoDimensionViewport() 
    { 
     InitializeComponent(); 
     DoubleBuffered = true; 
     GridSize = 16; 
     AutoScroll = false;    
     AdjustFormScrollbars(true); 
    } 

    protected override void AdjustFormScrollbars(bool displayScrollbars) 
    {    
     VerticalScroll.Minimum = 0; 
     VerticalScroll.Maximum = 8000000; 
     HorizontalScroll.Minimum = 0; 
     HorizontalScroll.Maximum = 8000000; 
     HorizontalScroll.Enabled = true; 
     VerticalScroll.Enabled = true;    
     HorizontalScroll.Visible = true; 
     VerticalScroll.Visible = true; 

     HorizontalScroll.Value = viewOffset.X + 4000000; 
     VerticalScroll.Value = viewOffset.Y + 4000000;    
    }   

    private ViewSettingsProvider viewSettingsProvider; 
    public ViewSettingsProvider ViewSettingsProvider 
    { 
     get 
     { 
      return viewSettingsProvider; 
     } 
     set 
     { 
      UnbindViewSettingsProvider(); 
      viewSettingsProvider = value; 
      BindViewSettingsProvider(); 
     } 
    } 

    public int GridSize { get; private set; } 

    protected override void OnScroll(ScrollEventArgs se) 
    { 
     base.OnScroll(se); 

     if (se.ScrollOrientation == ScrollOrientation.HorizontalScroll) 
     { 
      viewOffset.X = se.NewValue - 4000000;     
     } 
     else if (se.ScrollOrientation == ScrollOrientation.VerticalScroll) 
     { 
      viewOffset.Y = se.NewValue - 4000000; 
     }       

     Invalidate();       
    } 

    protected override void OnPaint(PaintEventArgs pe) 
    {    
     pe.Graphics.FillRectangle(Brushes.Black, pe.ClipRectangle); 

     DrawGrid(pe.Graphics);    

     base.OnPaint(pe); 
    } 

    private void DrawGrid(Graphics graphics) 
    { 
     for (int i = 0, count = 0; i < ClientRectangle.Width; i++) 
     { 
      bool increaseCount = false; 

      if ((i - viewOffset.X) % GridSize == 0) 
      { 
       graphics.DrawLine(
        count % 5 == 0 ? Pens.White : Pens.DarkGray, 
        i, 0, 
        i, ClientRectangle.Height); 

       increaseCount = true; 
      } 

      if ((i - viewOffset.Y) % GridSize == 0) 
      { 
       graphics.DrawLine(
        count % 5 == 0 ? Pens.White : Pens.DarkGray, 
        0, i, 
        ClientRectangle.Width, i); 

       increaseCount = true; 
      } 

      if (increaseCount) 
       count++; 
     } 
    } 

    private void BindViewSettingsProvider() 
    { 

    } 

    private void UnbindViewSettingsProvider() 
    { 

    } 
} 

ответ

3

Да, похоже, проблемы. Вместо этого выведите свой класс из панели. Установите для AutoScroll значение true, свойство AutoMinSize - размер прокручиваемой сетки. Это автоматически отображает полосы прокрутки. Используйте метод OnPaintBackground() для рисования фона и сетки. Вам необходимо будет компенсировать чертеж сетки с помощью свойства AutoScrollPosition:

protected override void OnPaintBackground(PaintEventArgs e) { 
    e.Graphics.FillRectangle(Brushes.Black, this.ClientRectangle); 
    e.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y); 
    for (int x = 0; x < this.AutoScrollMinSize.Width; x += GridSize) 
     e.Graphics.DrawLine(Pens.White, x, 0, x, this.AutoScrollMinSize.Height); 
    for (int y = 0; y < this.AutoScrollMinSize.Height; y += GridSize) 
     e.Graphics.DrawLine(Pens.White, 0, y, this.AutoScrollMinSize.Width, y); 
    } 
Смежные вопросы