鼠标左键抬起事件和打开文件对话框

5
我有一个网格中的几张图片,当我点击一个按钮时,会出现一个“打开文件对话框”(当然是在图片上方)。
Microsoft.Win32.OpenFileDialog dlgOpenFiles = new Microsoft.Win32.OpenFileDialog(); dlgOpenFile.DoModal();
这些图像有一个LeftButtonUp事件附加。问题是,如果我通过双击选择一个文件,打开文件对话框将关闭(这很好),但除此之外,被单击文件后面的图像会接收到LeftButtonUp消息,这一点一点也不好。
我正在使用wpf/c#/vs2010。

你能分享一下你的布局吗?你确定你的图片没有被误点击过吗? - Amsakanna
我也有同样的问题。我认为这是微软公共对话框的一个bug。在显示对话框之前,我使用“-=”运算符从事件链中删除了事件处理函数,然后在对话框关闭后,我重新添加了事件处理函数,但是很快它们就会自动触发...无论如何,我都无法摆脱它。 - LazNiko
2个回答

5

简单的方法是,每当您需要一个按钮抬起事件的处理程序时,在其中添加一个按钮按下事件,并执行CaptureMouse()。现在在您的按钮抬起事件中,您可以忽略所有没有IsMouseCaptured的事件。并确保不要忘记ReleaseMouseCapture()

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    CaptureMouse();
}

private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (!IsMouseCaptured)
        return;
    ReleaseMouseCapture();
    var dlg = new OpenFileDialog();
    var res = dlg.ShowDialog(this);
    // ...
}

0

12年后...

repka的答案(如上所述)在WPF UserControl实现中对我无效,但它让我走上了正确的道路。相同的概念,只是使用布尔变量而不是CaptureMouse()。到目前为止,测试结果是积极的。

感谢repka!

示例:

    private bool _mouseDown = false;

    private void LinkButton_LeftMouseButtonDown(object sender, MouseButtonEventArgs e)
    {
        this._mouseDown = true;
    }

    private void LinkButton_LeftMouseButtonUp(object sender, MouseButtonEventArgs e)
    {
        if (!this._mouseDown)
             return;
        this._mouseDown = false;

        //MouseUp logic here
    }

我在看到你的答案之前就用过这个,但对我来说不起作用... :/ - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接