Поведение Microsoft VSrollBar или ошибка с сенсорным экраном - формы Windows
Я обнаружил странное поведение с VScrollBar (вертикальная полоса прокрутки доступна в наборе инструментов Visual Studio). Проблема в "если я проведу вниз по полосе прокрутки, она поднимется вверх. Если я проведу вверх, он движется вниз».
Шаги для воспроизведения ошибки или поведения - 1
1) Добавьте VScrollBar как дочерний элемент к любому пользовательскому элементу управления.
2) Проведите вверх или вниз по пользовательскому элементу управления (не по полосе прокрутки). Вертикальная полоса прокрутки перемещается в противоположном направлении, даже если между контентом и VScrollBar нет программной связи
Шаги для воспроизведения ошибки или поведения - 2
1) Добавьте VScrollBar как дочерний элемент к любому пользовательскому элементу управления.
2) Проведите по полосе прокрутки, она будет двигаться вверх во время пролистывания вверх и вниз во время пролистывания вниз (правильное поведение)
3) Проведите вверх или вниз по пользовательскому элементу управления. Вертикальная полоса прокрутки перемещается в противоположном направлении
4) Теперь проведите вверх или вниз по вертикальной полосе прокрутки. Вертикальная полоса прокрутки начинает двигаться в противоположном направлении (багги поведение, происходит только после ошибки № 1)
Простое управление с вертикальной полосой прокрутки, чтобы повторить это поведение
public class QuickViewer : Control
{
public QuickViewer()
{
// Designer generated code
// Copy pasted for illustration alone
this.vScrollBar1 = new System.Windows.Forms.VScrollBar();
this.SuspendLayout();
//
// vScrollBar1
//
this.vScrollBar1.Location = new System.Drawing.Point(420, 4);
this.vScrollBar1.Name = "vScrollBar1";
this.vScrollBar1.Size = new Size(this.vScrollBar1.Width, 292);
//
// QuickViewer
//
this.Controls.Add(this.vScrollBar1);
this.Name = "QuickViewer";
this.Size = new System.Drawing.Size(441, 296);
this.vScrollBar1.Value = 5;
this.ResumeLayout(false);
}
protected override void OnPaint(PaintEventArgs e)
{
//My actual control is different. I prepared a simple control to replicate the buggy behavior of VScrollBar
//Control border
Pen borderPen = new Pen(Color.LawnGreen, 5);
e.Graphics.DrawRectangle(borderPen, ClientRectangle);
borderPen.Dispose();
//View area
Rectangle rect = new Rectangle(ClientRectangle.Location, ClientRectangle.Size);
rect.Inflate(-25, -10);
e.Graphics.FillRectangle(Brushes.White, rect);
e.Graphics.DrawRectangle(Pens.Black, rect);
this.Font = new System.Drawing.Font("Segoe UI", 12, FontStyle.Bold);
StringFormat format = new StringFormat() { Alignment = StringAlignment.Center };
e.Graphics.DrawString("Quick viewer", this.Font, Brushes.Black, rect, format);
string content = "This is a control created to illustrate the bug in VScrollBar." +
"\n Control area refers to the area with white background" +
"\n Control and Vertical Scrollbar are not programatically connected with each other."
+ "But still VScrollBar moves if you swipe on control area";
Font font = new System.Drawing.Font("Segoe UI", 12, FontStyle.Italic);
rect.Y += 20;
e.Graphics.DrawString(content, font, Brushes.Black, rect, format);
font.Dispose();
format.Dispose();
base.OnPaint(e);
}
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private System.Windows.Forms.VScrollBar vScrollBar1;
}
Вопрос:
Есть ли способ преодолеть это поведение или ошибку? Я хочу, чтобы полоса прокрутки двигалась вниз, когда проводишь вниз, и двигалась вверх, когда проводишь вверх. При перелистывании содержимого не должно быть прокрутки