使用ShowDialog()打开的表单如何关闭?

4
我有一个WinForm应用程序,其中我编写了自己的小颜色选择器,它只显示系统颜色。它基本上是一个TableLayoutPanel,其中添加了一堆较小的面板,我只需设置背景颜色即可。
相当简单:

enter image description here

现在我正在打开这个表单:
using (frmColourWindow colourPicker = new frmColourWindow (Cursor.Position.X, Cursor.Position.Y, findingPriority))
{
    colourPicker.ShowDialog();
    if (!colourPicker.SelectedColor.IsEmpty)
    {
        pnlColor.BackColor = colourPicker._SelectedColor;
    }                    
}

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

这一切都运行得很好,我唯一无法正确处理的是在窗体失去焦点时(例如,当用户单击其他地方或开始输入时)关闭它。我已经查看了DeactivateLostFocusLeave事件。只是似乎不能在我想要它们触发时得到这些事件。也许我漏掉了一些明显的东西?


当使用ShowDialog()打开一个窗体时,只有在该窗体关闭之前才能“使用”它。如果我正确理解您的意思,那么请改用Show()而不是ShowDialog(),这样事件就会触发。 - Bojan B
当然可以,选择面板并单击ApplicationSettings。如果需要更多帮助,请按F1。 - Hans Passant
@Bojan,如果我在颜色选择器中使用 Show(),然后从颜色选择器内部编程性地使用Close()关闭窗体,那么我如何获取所选颜色?因为一旦窗体关闭,背面的小面板必须设置为该颜色。 - Code Vader
1
@CodeVader,有多种方法可以实现这一点,您可以在颜色选择器上添加 OnCloseOnClosing 事件监听器来设置颜色(前提是所选颜色是公开可访问的属性),您可以创建一个自定义事件将颜色发送到调用者窗体,您可以将要设置背景的对象作为参数传递给颜色选择器... - Bojan B
2个回答

3
如我在评论中提到的那样,当使用 ShowDialog() 时,您只能使用已打开的对话框,因此它永远不会失去焦点,所以像 DeactivateLostFocusLeave 这样的事件将不起作用。
您需要使用 Show() 命令来使用这些事件关闭已打开的窗体。
至于您在评论中指出的关于将颜色分配给对象的问题,您可以执行以下操作:
声明一个公共属性。
Color SelectedColor {get; private set; }

在你的颜色选择器中,将使用语句更改为以下内容:
var colourPicker = new frmColourWindow (Cursor.Position.X, Cursor.Position.Y, findingPriority);
colourPicker.Closed += (o, args) => { pnlColor.BackColor = colourPicker.SelectedColor };
colourPicker.Show(); 

这当然只是其中一种可能的解决方案。

当然,如果他启动了一个不同的程序,它就会失去焦点。 - Lasse V. Karlsen

0

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


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