关闭由 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
关闭它。
这一切都很好,我唯一做不到的是在失去焦点时关闭表单(例如,当用户单击其他地方或开始输入时)。我查看了 Deactivate
、LostFocus
和 Leave
事件。只是似乎无法让这些事件在我想要的时候触发。也许我遗漏了一些明显的东西?
您可以通过使用 Show()
方法显示表单然后使用 Form.Deactivate 事件来实现。
正如我在评论中提到的,当使用 ShowDialog()
时,您只能使用您打开的对话框,因此它永远不会失去焦点,所以像 Deactivate
、LostFocus
这样的事件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();
这当然只是众多可能的解决方案之一。
我有一个 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
关闭它。
这一切都很好,我唯一做不到的是在失去焦点时关闭表单(例如,当用户单击其他地方或开始输入时)。我查看了 Deactivate
、LostFocus
和 Leave
事件。只是似乎无法让这些事件在我想要的时候触发。也许我遗漏了一些明显的东西?
您可以通过使用 Show()
方法显示表单然后使用 Form.Deactivate 事件来实现。
正如我在评论中提到的,当使用 ShowDialog()
时,您只能使用您打开的对话框,因此它永远不会失去焦点,所以像 Deactivate
、LostFocus
这样的事件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();
这当然只是众多可能的解决方案之一。