2015-12-16 5 views
1

У меня есть панель в winform. Я хочу захватить как прокрутку, так и колесико мыши для панели. Для обоих сценариев я хочу проверить положение полосы прокрутки.Получение позиции прокрутки из события колеса мыши

Когда полоса прокрутки находится внизу (в конце прокрутки ...), управление должно запускать событие.

Я сделал это для Panel.Scroll так:

private void Panel1_Scroll(object sender, ScrollEventArgs e) 
{    
    if (e.NewValue == Panel1.VerticalScroll.Maximum - Panel1.VerticalScroll.LargeChange+1) 
    { 
     //do some operation 
    } 
} 

Но MouseEventArgs нет значения (e.newvalue), чтобы указать положение полосы прокрутки.

Как я могу получить положение полосы прокрутки от события колеса мыши?

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

Как я могу это достичь?

+0

Вы не можете конечно. Событие MouseWheel получит событие Scroll, если оно фактически прокручивает панель, поэтому вам не нужно помогать. Панель должна содержать один или несколько элементов управления, которые могут получить фокус, или вы должны создать [панель управления] (http://stackoverflow.com/a/3562449/17034), которые могут получить фокус. Остерегайтесь шелушащегося поведения полос прокрутки из-за большого размера пальца, вы должны использовать> = вместо ==. –

ответ

0

Попробуйте VerticalScroll Недвижимость Panel.

void MouseWheel(object sender, MouseEventArgs e) 
    { 
     if (_panel.VerticalScroll.Value > _panel.VerticalScroll.Maximum - _panel.VerticalScroll.LargeChange) 
      MessageBox.Show("Bottom"); 
    } 
+0

Отлично подходит для меня. Но я не могу реализовать ту же логику для прокрутки и колеса мыши, поскольку они имеют разные eventargs !!! –

+1

Но вы можете использовать 'panel.VerticalScroll.Value' в обоих случаях - для прокрутки и для колесика мыши вместо' e.NewValue' – melya

+0

Правильно, но колесико прокрутки и мыши имеет разные события, поэтому он не может перегружать –

1

Ну при дальнейшем анализе я проверил, что panel1.VerticalScroll.Value эквивалентно e.NewValue из ScrollEventArgs.

Так что для кода повторного использования ниже могут быть использованы:

private void panel1_Scroll(object sender, ScrollEventArgs e) 
{ 
    panel1_scrollcheck(e.NewValue); 
} 

private void panel1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    panel1_scrollcheck(panel1.VerticalScroll.Value); 
} 

private void panel1_scrollcheck(int currPos) 
{ 
    if (currPos == panel1.VerticalScroll.Maximum - panel1.VerticalScroll.LargeChange+1) 
    { 
     //Put the logic here 
    } 
} 
+0

, так что вы только что использовали мой ответ и даже не приняли его? – melya

+0

@meiya, я принял ур ответ althogh, это частично. А также, если условие неверно (не уверен в реализации ура, но для меня работает равное условие, а также currPos никогда не будет> ... если сомнение, пожалуйста, проверьте точный вопрос обо мне ...) –

+0

Почему это частичная? Я показал вам, что использовать для решения вашей проблемы и привести пример. Или вы ждали, что я напишу для вас весь код? – melya

Смежные вопросы