单击Strange ToolStripButton可打开OpenFileDialog行为

本文关键字:OpenFileDialog 行为 Strange ToolStripButton 单击 | 更新日期: 2023-09-27 18:29:26

我发现了一个奇怪的ToolStripButton双击问题。这些步骤将重现问题:

  1. 创建Windows窗体应用程序
  2. 在主窗体上添加一个ToolStrip
  3. ToolStrip上添加一个ToolStripButton
  4. 在主窗体上添加一个OpenFileDialog
  5. 在属性工具箱中双击ToolStripButtonClick事件
  6. toolStripButton1_Click方法中添加此项:

    openFileDialog1.ShowDialog();
    
  7. 开始调试
  8. 快速双击ToolStripButton

问题来了。首先,弹出一个打开的文件对话框,我关闭它,然后弹出另一个对话框。这不应该发生。我再次关闭它,然后主窗体可能有一些重绘问题。最后,我关闭了主窗体,但程序仍在运行。

请你自己试试,如果发生了这些事,请告诉我。

为什么会发生这种情况?我该怎么办才能解决它?

你可以用这个来重现问题:

using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WinForm
{
    class MyForm : Form
    {
        private IContainer components = null;
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        private void InitializeComponent()
        {
            openFileDialog1 = new OpenFileDialog();
            toolStrip1 = new ToolStrip();
            toolStripButton1 = new ToolStripButton();
            toolStrip1.SuspendLayout();
            this.SuspendLayout();
            toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripButton1 });
            toolStripButton1.Text = "toolStripButton1";
            toolStripButton1.Click += new EventHandler(toolStripButton1_Click);
            this.Controls.Add(toolStrip1);
            toolStrip1.ResumeLayout(false);
            toolStrip1.PerformLayout();
            this.ResumeLayout(false);
            this.PerformLayout();
        }
        private OpenFileDialog openFileDialog1;
        private ToolStrip toolStrip1;
        private ToolStripButton toolStripButton1;
        public MyForm()
        {
            InitializeComponent();
        }
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyForm());
        }
    }
}

单击Strange ToolStripButton可打开OpenFileDialog行为

为什么会发生这种情况?

我真的不知道,这对我来说是个惊喜!!

我该怎么办才能解决它?

这是一个简单的解决方法:

private bool clicked = false;
private void toolStripButton1_Click(object sender, EventArgs e)
{
    if (clicked) return;
    clicked = true;
    openFileDialog1.ShowDialog();
    clicked = false;
}

编辑:
我想问题不在于双击本身,而在于OpenFileDialog的行为
如果您尝试此代码,即使(意外)双击,错误也会消失

private void toolStripButton1_Click(object sender, EventArgs e)
{
    using (OpenFileDialog dlg = new OpenFileDialog()
    {
        Title = "Open file",
        Filter = "PDF files|*.pdf|All files|*.*"
    })
    {
        dlg.ShowDialog();
        Debug.WriteLine(dlg.FileName);
    }
}

如果使用tsb1.DoubleClickEnabled = true,错误将消失。。。但我不确定这是一个好的解决方案

我决定(现在)使用这个:

private void toolStripButton1_Click(object sender, EventArgs e)
{
    toolStripButton1.Enabled = false;
    openFileDialog1.ShowDialog();
    toolStripButton1.Enabled = true;
}