winforms 显示带有所有者窗口的服务通知消息框不是有效的操作,请使用不接受所有者的Show方法

fquxozlt  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(227)

我试图在新表单的帮助下将MessageBox保持在顶部。

MessageBox.Show(new Form { TopMost = true }, message, heading, buttonType, icon, MessageBoxDefaultButton.Button1, Options);

当我从一个窗体调用它时,它工作正常,但是当我使用一个子弹出窗体(父用户控件的子控件)调用相同的方法时,它会抛出下面的异常。

Exception: Showing a service notification message box with an owner window is not a valid operation. Use the Show method that does not take an owner.

问题是选项参数,我试图传递下面的选项,但两者都不起作用。

MessageBoxOptions.DefaultDesktopOnly
MessageBoxOptions.ServiceNotification

child(popProductionConfirmation)方法调用:

private void callMyMethod()
{
    ShowMessageInMessageBox("Automatic Posting Done", "Production Confirmation", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxOptions.DefaultDesktopOnly);
}

private void ShowMessageInMessageBox(string message, string heading, MessageBoxButtons buttonType, MessageBoxIcon icon, MessageBoxOptions Options)
    {
        CommonMethods.ShowMessageInMessageBox(message, heading, buttonType, icon, Options, this);
    }

带有MessageBox的CommonMethods类:

public static void ShowMessageInMessageBox(string message, string heading, MessageBoxButtons buttonType, MessageBoxIcon icon, MessageBoxOptions Options, IWin32Window owner = null)
    {
        if (owner == null)
        {
            MessageBox.Show(new Form { TopMost = true }, message, "BTS: " + heading, buttonType, icon, MessageBoxDefaultButton.Button1, Options);
        }
        else
        {
            MessageBox.Show(owner, message, "BTS: " + heading, buttonType, icon, MessageBoxDefaultButton.Button1, Options);
        }
    }

父项和子项弹出窗口创建:

popProductionConfirmation objpopProductionConfirmation;
objpopProductionConfirmation = new popProductionConfirmation();
objpopProductionConfirmation.ShowDialog();

那么,有没有什么方法可以将MessageBox保留在顶部,或者有没有什么方法可以验证或解决这个问题呢?

irtuqstp

irtuqstp1#

这个错误告诉你所有你需要知道的,特别是这部分:
使用不接受所有者的Show方法。
查看框架的源代码:

if (owner != IntPtr.Zero && (options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != 0)
{ 
    throw new ArgumentException (SR.Get(SRID.CantShowMBServiceWithOwner)); 
}

它专门寻找一个条件,当你提供一个所有者并使用你试图使用的任何一个标志时,它会抛出一个错误:
SRID.CantShowMBServiceWithOwner定义为:
显示具有所有者窗口的服务通知消息框不是有效的操作。请使用不接受所有者的Show方法。
这就是你看到的错误。
所以要么:

  • 使用Show()重载,该重载将所有者作为参数,或者
  • 使用一个以owner为参数,不使用MessageBoxOptions参数的。

要将消息框保留在顶部,请执行以下操作:

  • 如果使用owner,请将owner的TopMost属性设置为true
  • 如果使用不带所有者的重载,请使用MessageBoxOptions.DefaultDesktopOnly选项。

相关问题