UserControl有时不接收点击消息

问题描述 投票:1回答:1

我正在编写具有类似按钮行为的自定义控件。用户需要能够处理单击事件,并且控件需要在视觉上发出已被按下的信号。我在OnMouseDown方法中更改了控件的可视状态,并在OnMouseUp中将其还原了,并且效果很好。但是,我在测试中注意到,我的控件不会总是收到鼠标点击消息,但是设备会为点击发出适当的听觉信号,并且控件不会失去焦点。

P.S。如果有人知道有一个好的实用程序,它将允许我记录发送到我的应用程序的Windows消息,这些消息可能会激增,并可能帮助我查看可能出了什么问题。

这里是我所拥有的东西的非常简化的版本

public class CustomButton : UserControl
{
    private bool _isMouseDown = false;//flag tells PaintBorder what state to draw

    protected override void OnPaint(PaintEventArgs e)
    {
         base.OnPaint(e);
         PaintBackground(e);
         PaintBorder(e, _isMouseDown);
    }

    protected override void OnGotFocus(EventArgs e)
    {
        this.Invalidate();
        base.OnGotFocus(e);
    }

    protected override void OnTextChanged(EventArgs e)
    {
        this.Invalidate();
        base.OnTextChanged(e);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _isMouseDown = true;

            if (!this.Focused)
            {
                this.Focus();
            }
            else //getting focus causes Invalidate, no need to call twice
            {
                this.Invalidate();
            }
        }
        base.OnMouseDown(e);
    }

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (_isMouseDown)
        {
            _isMouseDown = false;
            this.Invalidate();
        }
        base.OnMouseUp(e);
    }
}
winforms windows-mobile compact-framework windows-ce
1个回答
0
投票

我在Compact Framework的按钮控件上遇到类似的问题。

事实证明,如果您足够快地单击一个按钮,某些Click将变成DoubleClick

此代码为我解决了此问题:

protected override void OnDoubleClick(EventArgs e)
{
    base.OnClick(e);
}

请注意,插入此代码后DoubleClick将不再起作用。

© www.soinside.com 2019 - 2024. All rights reserved.