Нужно, чтобы колесико мыши прокручивало пользовательский контроль - PullRequest
3 голосов
/ 04 марта 2009

У меня есть пользовательский контроль, который я создал. Я добавил панель и вертикальную полосу прокрутки справа от нее. Я хотел бы иметь возможность прокрутить его с помощью колесика мыши. Проблема в том, что на колесе мыши не возникает никаких событий. Если я снимаю панель, то пользовательский элемент управления имеет фокус, и он запускает колесико мыши в форме. Но с панелью на ней, похоже, не запускается событие колесика мыши на панели или пользовательский элемент управления внутри элемента управления или даже в форме. Лучшим решением было бы запустить событие в пользовательском контроле, но я бы даже принял событие в форме и отправил его обратно в пользовательский контроль.

Я использую vb.net и vs2005, если это имеет значение.

Ответы [ 5 ]

3 голосов
/ 05 марта 2009

да, панель может иметь фокус. Вы просто должны сосредоточиться на этом, я предпочитаю использовать при наведении мыши.

Я сделал это, и его проблема решена.

2 голосов
/ 04 марта 2009
  • Создание нового проекта VB.NET Winforms
  • Поместите элемент управления Panel в форму
  • Установите для свойства «AutoScroll» панели значение «true»
  • Поместите следующий код в событие загрузки формы

    For i As Integer = 1 To 100
        Dim b As New Button()
        b.Text = i.ToString()
        b.Size = New Size(60, 40)
        b.Location = New Point(0, (i * b.Height) - b.Height)
        b.Parent = Panel1
        Panel1.Controls.Add(b)
    Next
    

Запустите проект.

Вы должны увидеть форму со 100 кнопками внутри панели управления.
Элемент управления Panel должен содержать вертикальную полосу прокрутки.
Использование колеса прокрутки внутри панели должно прокручивать кнопки.

Надеюсь, этот пример поможет.

Редактировать

Я добавил панель и вертикальную полосу прокрутки справа от нее.

Это не правильный способ сделать это.
Вам необходимо использовать свойство AutoScroll Panel.

Редактировать
Другой пример:

  • Создать новый проект VB.NET
  • Поместите две кнопки в форму
  • Создать новый пользовательский контроль
  • Установите для свойства autoscroll в usercontrol значение true
  • Вставьте следующий код в событие загрузки формы

    Dim uc As New UserControl1
    uc.Parent = Me
    Me.Controls.Add(uc)
    uc.Size = New Size(100, 100)
    uc.Location = New Point(0, 0)
    For i As Integer = 1 To 100
        Dim b As New Button()
        b.Text = i.ToString()
        b.Size = New Size(60, 40)
        b.Location = New Point(0, (i * b.Height) - b.Height)
        b.Parent = uc
        uc.Controls.Add(b)
    Next
    

Запустите программу.

Нажмите кнопки (в форме).
Обратите внимание, что вам нужно щелкнуть UserControl, чтобы установить его фокус и использовать колесо прокрутки.

2 голосов
/ 05 марта 2009

Я занимался этим весь день, возможно, я понял это. Событие mousewheel отправляется только элементу управления с фокусом. Панель не может иметь фокус. Так как панель покрывает пользовательский контроль, она также не может получить фокус. (если это не единственный элемент управления в форме) Если для события mouseenter панели я вызываю me.focus, он устанавливает фокус на usercontrol, позволяя ему получать событие mousewheel. Событие запускается как в форме, так и в элементе управления. Я все еще открыт для предложений, если есть лучший способ, поскольку это кажется немного хакерским.

1 голос
/ 05 декабря 2011

Вы также можете добавить следующую строку кода:

    private void UserControl1_Scroll(object sender, ScrollEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString("hh:mm:ss") + " Scrolling inside" + e.NewValue + " <- " + e.OldValue);
        this.VerticalScroll.Value = e.NewValue;
    }

Это позволяет видеть элементы в элементе управления при перемещении полосы прокрутки вверх и вниз. Без него элемент управления прокручивается только при отпускании полосы прокрутки.

1 голос
/ 04 марта 2009

Здесь - статья о работе с событиями мыши в vb.net. В частности, упоминается прокрутка мыши.

...