Como posso rolar meu painel usando a minha roda do mouse?
-
05-07-2019 - |
Pergunta
Eu tenho um painel no meu formulário com AutoScroll conjunto como true para uma barra de rolagem aparece automaticamente.
Como posso fazê-lo para que um usuário pode usar sua roda do mouse para rolar o painel? Graças SO.
Solução
O painel ou um controle no painel devem ter foco. Note-se que, se o controle com foco tem barras de rolagem, que vai rolar em vez do painel.
Outras dicas
O que funcionou para mim foi acrescentando panel1_MouseEnter
EventHandler:
private void panel1_MouseEnter(object sender, EventArgs e)
{
panel1.Focus();
}
Abaixo código funciona para mim .....
Public Form
{
InitializeComponent();
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);
}
private void Panel1_MouseWheel(object sender, MouseEventArgs e)
{
panel1.Focus();
}
No arquivo de designer, você pode adicionar a seguinte linha de código. o evento MouseWheel não é doumented na lista de eventos na janela Propriedades.
this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);
Panel1_MouseWheel será acionado quando você rolar o mouse weel
Adicione o código no arquivo .cs
Certifique-se de que o painel tem o foco. E isso é simples código para rolar sua barra de rolagem do painel. Espero que isso ajuda. :) introduza aqui
if(e.Delta > 0)
{
if (pnlContain.VerticalScroll.Value - 2 >= pnlContain.VerticalScroll.Minimum)
pnlContain.VerticalScroll.Value -= 2;
else
pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum;
}
else
{
if (pnlContain.VerticalScroll.Value + 2 <= pnlContain.VerticalScroll.Minimum)
pnlContain.VerticalScroll.Value += 2;
else
pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum;
}
Eu estou usando uma janela formar com BorderStyle definida como Nenhum, onde eu uso um painel para ter todos os meus controles, assim que olha agradável (diferença de cor e tal ..) estava tendo o mesmo problema enquanto eu tinha outras formas que funcionou bem.
O que eu esqueci:
public myForm()
{
InitializeComponent();
this.DoubleBuffered = true;
}
DoubleBuffered é I mágica notado ..
Movendo a roda de rolagem deve desencadear evento MouseMove do controle. O argumento MouseEventArgs tem uma propriedade denominada Delta, o que dá o número (assinado) de entalhes que a roda do mouse foi movido. Você pode usar essa propriedade para rolar o painel.
O manipulador de eventos DataGridView_MouseWheel estava sendo chamado, mas o valor FirstDisplayedScrollingRowIndex nunca mudou. O valor foi sempre '0' mesmo depois de definir explicitamente a 1. É como se a propriedade foram somente leitura.
O Ainda repro em .Net Framework 4.6.
No meu caso, toda a área cliente do painel foi ocupado por UserControls (não um único pixel da área interna visível, exceto as barras de rolagem).
Neste caso, o painel não obter o rato-eventos e nunca vai se concentrar (apperently, clicar na barra de rolagem não conta como "estar dentro do painel").
Eu tive que adicionar as seguintes linhas para o construtor da minha classe derivada UserControl:
MouseEnter += delegate {
Parent?.Focus();
};
Agora, ele funciona muito bem, como eu não tenho o conteúdo de rolagem nas UserControls.