1

我发现当我将MouseWheel事件附加到 myUserControl或 a时,如果是可滚动的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());
    };
}
4

1 回答 1

3

我假设您的意思是UserControl上的 MouseWheel 事件不会触发。这很正常,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);
}
于 2010-11-26T19:20:54.503 回答