关闭由 ShowDialog() 打开的窗体

Closing a form that was opened by ShowDialog()

我有一个 winform 应用程序,我在其中编写了自己的小颜色选择器,它只会显示系统颜色。它基本上是一个 TableLayoutPanel 添加了一堆较小的面板,我只是在其中设置了背景颜色。

很简单:

现在我打开此表单的对象是:

using (frmColourWindow colourPicker = new frmColourWindow (Cursor.Position.X, Cursor.Position.Y, findingPriority))
{
    colourPicker.ShowDialog();
    if (!colourPicker.SelectedColor.IsEmpty)
    {
        pnlColor.BackColor = colourPicker._SelectedColor;
    }                    
}

并在用户单击其中一个颜色面板时通过设置 DialogResult 关闭它。

这一切都很好,我唯一做不到的是在失去焦点时关闭表单(例如,当用户单击其他地方或开始输入时)。我查看了 DeactivateLostFocusLeave 事件。只是似乎无法让这些事件在我想要的时候触发。也许我遗漏了一些明显的东西?

您可以通过使用 Show() 方法显示表单然后使用 Form.Deactivate 事件来实现。

正如我在评论中提到的,当使用 ShowDialog() 时,您只能使用您打开的对话框,因此它永远不会失去焦点,所以像 DeactivateLostFocus 这样的事件Leave 将不起作用。

您需要使用Show() 命令来使用这些事件来关闭打开的表单。

关于解决您在有关为对象分配颜色的评论中指出的问题。您可以执行以下操作:

声明一个public属性

Color SelectedColor {get; private set; }

在您的颜色选择器中,将您的 using 语句更改为:

var colourPicker = new frmColourWindow (Cursor.Position.X, Cursor.Position.Y, findingPriority);
colourPicker.Closed += (o, args) => { pnlColor.BackColor = colourPicker.SelectedColor };
colourPicker.Show(); 

这当然只是众多可能的解决方案之一。