如何显示一个带有复选框的消息框?

17
我想创建一个带有/按钮和复选框的 MessageBox
这个应用程序是一款图片缩放工具,可以同时调整多张图片的大小;在此过程中,它将检查新位置的文件名是否已存在,并提供覆盖选项。 MessageBox 将提供覆盖任何新文件的选项,而复选框将避免需要点击 Yes 按钮多次以覆盖每个文件。
如何在 MessageBox 对话框中添加复选框?

5
创建自定义对话框。 - Tim Schmelter
是的,我同意。自定义对话框是正确的选择。在这里也可以看到:http://social.msdn.microsoft.com/Forums/vstudio/en-US/2fa7e3e3-f55f-4c0d-bcf5-c7278af1d730/how-to-display-a-checkbox-in-message-box - rsbarro
4个回答

20
创建自定义对话框。以下内容可能会给你一些想法:
public static class CheckboxDialog
{   
    public static bool ShowDialog(string text, string caption)
    {
        Form prompt = new Form();
        prompt.Width = 180;
        prompt.Height = 100;
        prompt.Text = caption;
        FlowLayoutPanel panel = new FlowLayoutPanel();
        CheckBox chk = new CheckBox();
        chk.Text = text;
        Button ok = new Button() { Text = "Yes" };
        ok.Click += (sender, e) => { prompt.Close(); };
        Button no = new Button() { Text = "No" };
        no.Click += (sender, e) => { prompt.Close(); };
        panel.Controls.Add(chk);
        panel.SetFlowBreak(chk, true);
        panel.Controls.Add(ok);
        panel.Controls.Add(no);
        prompt.Controls.Add(panel);
        prompt.ShowDialog();
        return chk.Checked;
    }
}

你可以这样使用它:

bool overwrite = CheckboxDialog.ShowDialog("overwrite", "Overwrite location?");

如果我们有多个复选框?比如chk1,chk2,chk3,并且想要返回已选中的复选框的值,我们可以每次选择两个复选框并返回它们的值。那么我们该如何使用呢?@Tim - silent_programmer
@silent_programmer 可以以Tim的答案为例,在代码中添加更多复选框。 - Todd Price

18

你无法将复选框添加到消息框中。正如Tim和rsbarro所建议的,你应该创建一个自定义对话框。Tim的答案很好用,并且不需要创建新类。但如果你想在设计器中设计表单,可以尝试以下方法:

  • 创建一个包含两个按钮和一个复选框的新表单。
  • 在表单设计器中,将“是”按钮的DialogResult属性设置为Yes,将“否”按钮的DialogResult属性设置为No。这将让你发现用户点击了哪个按钮。
  • 在表单上创建一个反映复选框状态的属性(可选 - 我不喜欢从其他表单引用控件,但如果你将复选框公开,也可以使用它)。
public bool DoForAll
{
    get { return checkBox.Checked; }
}
  • 在您的主表单上,在需要时显示子表单。例如:
var options = new Options();
var result = options.ShowDialog();
if (result == DialogResult.Yes)
{
    var doForAll = options.DoForAll;
}

谢谢你的回答!在你和Tim的回答之间做出选择很困难,但最终你的回答在视觉上设计起来更容易一些。 - TK421
迄今为止最好的解决方案! - Ghasem

0

我知道这是一个非常老的帖子,但我只想发表一下我的看法。

Ookii 是将 CheckBox 实现到 MessageBox 或自定义它的最简单方法:https://github.com/ookii-dialogs/ookii-dialogs-wpf(我之前正在使用它,因为经典的“文件夹浏览器”对话框,所以干脆顺便用来做复选框)

以下是我的代码:

using Ookii.Dialogs.Wpf;

//create instance of ookii dialog
TaskDialog dialog = new();

//create instance of buttons
TaskDialogButton butYes = new TaskDialogButton("Yes");
TaskDialogButton butNo = new TaskDialogButton("No");
TaskDialogButton butCancel = new TaskDialogButton("Cancel");

//checkbox 
dialog.VerificationText = "Dont Show Again"; //<--- this is what you want.

//customize the window
dialog.WindowTitle = "Confirm Action";
dialog.Content = "You sure you want to close?";
dialog.MainIcon = TaskDialogIcon.Warning;

//add buttons to the window
dialog.Buttons.Add(butYes);
dialog.Buttons.Add(butNo);
dialog.Buttons.Add(butCancel);

//show window
TaskDialogButton result = dialog.ShowDialog(this);

//get checkbox result
if (dialog.IsVerificationChecked)
{
    //do stuff
}

//get window result
if (result != butYes)
{
    //if user didn't click "Yes", then cancel the closing.
    e.Cancel = true;
    return;
}

0

对于vb.net(查看此代码,仅显示一个按钮)

clsMsgBoxV1.ShowDialog("PDF solo de albaranes. (No avisarme mas)", "PDF")

并使用这个共享类:

Public Class clsMsgBoxV1

    Shared prompt As Form
    Shared chk As CheckBox
    Public Shared Function ShowDialog(Text As String, caption As String) As Boolean
        'frmUsuario


        prompt = New Form()
        chk = New CheckBox()

        prompt.StartPosition = FormStartPosition.CenterParent
        prompt.Width = 220
        prompt.Height = 150
        prompt.Text = caption

        prompt.MinimumSize = prompt.Size
        prompt.MaximumSize = prompt.Size

        prompt.MaximizeBox = False
        prompt.MinimizeBox = False

        Dim panel As FlowLayoutPanel =   New FlowLayoutPanel()

        chk.Text = Text
        chk.Width = chk.Width * 2
        chk.Height = 50
        Dim ok As Button = New Button() With {
            .Text = "Leido"
        }
        AddHandler ok.Click, AddressOf OKClick


        'Dim no As Button = New Button() With {
        '.Text = "No"
        '}
        'AddHandler no.Click, AddressOf NoClick


        ok.Width = prompt.Width - 30
        panel.Controls.Add(chk)
        panel.SetFlowBreak(chk, True)
        panel.Controls.Add(ok)
        'panel.Controls.Add(no)
        prompt.Controls.Add(panel)
        prompt.ShowDialog()
        prompt.Dispose()
        Return chk.Checked
    End Function

    Private Shared Sub NoClick(sender As Object, e As EventArgs)
        prompt.Close()
    End Sub
    Private Shared Sub OKClick(sender As Object, e As EventArgs)
        prompt.Close()

    End Sub

End Class

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