Событие MouseScroll не срабатывает при прокрутке TextBox - PullRequest
1 голос
/ 26 ноября 2010

Я обнаружил, что когда я присоединяю событие MouseWheel к своему UserControl или TextBox, оно не срабатывает, если TextBox прокручивается. Он будет прокручивать текстовое поле и не будет вызывать MouseWheel. Могу ли я сделать так, чтобы он запускал MouseWheel, а затем после выполнения чего-либо e.Cancel, чтобы TextBox не прокручивал?

ОБНОВЛЕНИЕ: с видео и кодом

Видео

http://screenr.com/ZGF

Код

http://www.mediafire.com/?x3o09dz6dr5zoym

public MainWindow()
{
    InitializeComponent();
    textBox.MouseWheel += (s, e) =>
    {
        Random rand = new Random();
        Debug.WriteLine(rand.NextDouble());
    };
}

1 Ответ

3 голосов
/ 26 ноября 2010

Полагаю, вы имеете в виду, что событие MouseWheel в UserControl не будет запускаться.Это нормально, TextBox с радостью принимает сообщение, когда оно многострочное.Причина, по которой событие MouseWheel не отображается в конструкторе.Родительское окно увидит сообщение только тогда, когда элемент управления с фокусом не обработает его.

Не уверен, что если вы исправите это, пользователь действительно будет ожидать прокрутки текстового поля.Но вы можете перехватить сообщение, чтобы текстовое поле его не увидело, и передать сообщение родителю.Добавьте новый класс в свой проект, вставьте код, показанный ниже.Компиляция.Удалите новый элемент управления с верхней части панели инструментов.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class MyTextBox : TextBox {
    protected override void WndProc(ref Message m) {
        if (m.Msg == 0x20a && this.Parent != null) {
            PostMessage(this.Parent.Handle, m.Msg, m.WParam, m.LParam);
        }
        else base.WndProc(ref m);
    }
    [DllImport("user32.dll")]
    private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}
...