Comportamento ou bug do Microsoft VSrollBar com tela sensível ao toque - Windows Forms
Encontrei um comportamento estranho com o VScrollBar (barra de rolagem vertical disponível na caixa de ferramentas do Visual Studio). O problema é "se eu deslizar para baixo na barra de rolagem, ela se move para cima. Se eu deslizar para cima, ele se move para baixo"
Etapas para replicar bug ou comportamento - 1
1) Adicione VScrollBar como filho a qualquer controle de usuário.
2) Passe o dedo para cima ou para baixo no controle do usuário (não na barra de rolagem). A barra de rolagem vertical se move na direção oposta, mesmo se não houver nenhuma conexão programática entre o conteúdo e o VScrollBar
Etapas para replicar bug ou comportamento - 2
1) Adicione VScrollBar como filho a qualquer controle de usuário.
2) Passe na barra de rolagem, ele se moverá para cima durante o deslize para cima e para baixo durante o deslize para baixo (comportamento correto)
3) Deslize para cima ou para baixo no controle do usuário. A barra de rolagem vertical se move na direção oposta
4) Agora deslize para cima ou para baixo na barra de rolagem vertical. A barra de rolagem vertical começa a se mover na direção oposta (comportamento de buggy, acontece somente após o bug no: 1)
Controle simples com barra de rolagem vertical para replicar esse comportamento
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;
}
Pergunta, questão:
Existe alguma maneira de superar esse comportamento ou bug? Quero que a barra de rolagem se desloque para baixo enquanto desliza para baixo e para cima enquanto desliza para cima. Não deve haver rolagem ao passar o mouse sobre o conteúdo