Я не могу получить прокрутку, работающую в моем пользовательском элементе управления. В настоящее время он рисует собственный контент (на данный момент только сетку) и должен рассматриваться как имеющий большую область для работы. Однако я не могу заставить прокрутку работать.Пользовательский контроль и прокрутка, помощь?
С включенным 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()
{
}
}