【问题标题】:Closing a form that was opened by ShowDialog()关闭由 ShowDialog() 打开的表单
【发布时间】:2017-04-29 20:41:06
【问题描述】:

我有一个 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 事件。只是似乎无法让这些事件在我想要的时候触发。也许我遗漏了一些明显的东西?

【问题讨论】:

  • 使用ShowDialog() 打开表单时,您只能“使用”该表单,直到它被关闭。如果我正确理解您想要什么,请使用 Show() 而不是 ShowDialog() 那么这些事件应该会触发。
  • 当然可以,选择面板并单击ApplicationSettings。如果您需要更多帮助,请按 F1。
  • @Bojan,如果我使用Show(),然后从颜色选择器内部以编程方式使用Close(),如何从颜色选择器中获取选定的颜色?因为一旦表单关闭,后面的小面板必须设置为该颜色
  • @CodeVader 有多种方法可以实现这一点,您可以在设置颜色的颜色选择器上添加 OnCloseOnClosing 事件侦听器(前提是所选颜色是可公开访问的属性),您可以有一个将颜色发送到调用程序表单的自定义事件,您可以将要为其设置背景的对象作为参数传递给颜色选择器...

标签: c# winforms lost-focus dialogresult


【解决方案1】:

正如我在 cmets 中提到的,在使用 ShowDialog() 时,您只能使用已打开的对话框,因此它永远不会失去焦点,因此像 DeactivateLostFocusLeave 这样的事件将不起作用.

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

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

声明一个公共属性

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(); 

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

【讨论】:

  • 当然,如果他激活不同的程序,它会失去焦点。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多