2010-03-26 48 views
6

在开发WinForms应用程序时,我遇到了我认为是OpenFileDialog和SaveFileDialog控件中的一个错误。谷歌搜索发现了一位注意到相同问题的其他人,但未提供解决方案和解决方法。您可以在以下网址查看该主题:http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-eventFileDialog DoubleClick行为

我在处理MouseDown事件的窗体上有一个自定义控件。如果我在鼠标悬停在这个控件上的时候双击FileDialog控件中的一个文件(显然它们之间有对话),MouseDown事件就会被触发。我不认为这是我的控制问题,因为我之前提到的人注意到这发生在PictureBox控件中。看起来,即使在对话框中按下了鼠标按钮(用于第二次点击以打开文件),当对话框关闭时,事件传递给窗体和我的控件。

我已经尝试禁用我的控件,而对话框处于活动状态,但这并没有阻止它从捕获事件。我认为这是因为事件在对话框关闭后传递下去,所以我的控件将被重新启用。有谁知道一种方法来防止点击到达窗体,反过来,我的控制?另外,任何人都可以确认,如果这真的是FileDialog控件中的错误,或者如果我只是有一些设置配置不正确?

回答

1

当我意识到我的问题发生的原因时,我正在试验MouseDown和MouseMove事件。当FileDialog框消失时,MouseMove事件被触发。为了避免两次写同样的代码块,我试图从MouseMove处理程序中调用我的MouseDown处理程序,并认为某些条件(即,既不保留鼠标按钮)也会导致MouseDown处理程序有效地执行没有。问题在于鼠标按钮被按下,因为FileDialog框在MouseDown(而不是MouseClick)上消失。这导致MouseDown处理程序在我不期待它时执行其条件代码。

从中学习的经验:在链接事件处理程序时要小心谨慎。或者更好的办法是将通用功能引入一个方法,并且不要链接事件处理程序。 :-)

感谢Jelly Amma让我更加密切地关注实际事件。

3

我以前就听说过这个问题,并且据我所知这是确保您正确处理事件队列的问题。在没有看到代码的情况下,很难检查你的用户控件实现是否正确,但是经常重写鼠标事件而不让基本事件也发生会导致这种行为。

+0

我在我的重写的OnMouseDown(MouseEventArgs e)处理程序中调用base.OnMouseDown(e)。我曾尝试在我的处理程序之前(在其顶部)和之后(在其底部)调用它,但这两个位置似乎都没有对该问题产生任何影响。我将不得不更密切地关注事件队列,看看我能否在那里找到某些东西。 – 2010-03-26 08:22:21