自定义消息框类具有终端“弹出窗口”;当表单完成时

本文关键字:弹出窗口 窗口 完成时 表单 终端 自定义消息 | 更新日期: 2023-09-27 18:15:19

好吧,这有点奇怪,但本质上我需要一个带有按钮的消息框类,而不是c#中消息框类中的选项。因此,我仔细研究了如何创建自己的类(如果您感兴趣,这里是链接:http://social.msdn.microsoft.com/Forums/vstudio/en-US/1086b27f-683c-457a-b00e-b80b48d69ef5/custom-buttons-in-messagebox?forum=csharpgeneral),并使用了其中提供的示例。以下是相关代码:

public partial class Form1 : Form
{
  public static bool MessageSucceded { get; set; }
  public static string MessageContent{ private get; set; }
  private void buttonMyMessageBox_Click(object sender, EventArgs e)
  {   
   using (MyMessageForm myForm = new MyMessageForm())
  {
    myForm.ShowDialog();
    if (MessageSucceded = myForm.ShowDialog(this) == DialogResult.OK)
    {
     if (MessageContent== "Yes do it")
     {
       //HERE DO WHAT YOU WANT IF THE USER CLICKS ON BUTTON YES DO IT
     }
     else if (MessageContent== "No, don`t do it")
    {
      //HERE DO WHAT YOU WANT IF THE USER CLICKS ON BUTTON NO, DON`T DO IT
    }
   }
  }
 }
}
public partial class MyMessageForm : Form
{
 private void MyMessageForm_Load(object sender, EventArgs e)
 {
   this.StartPosition = FormStartPosition.CenterScreen;
   this.ShowIcon = false;
   this.ShowInTaskbar = false;
   this.MinimizeBox = false;
   this.MaximizeBox = false;
   this.buttonYes.Text = "Yes do it";
   this.buttonNo.Text = "No, don`t do it";
   this.labelMyForm.Text = "Are you sure you want to… ?";
 }
 private void buttonYes_Click(object sender, EventArgs e)
 {
   Form1.MessageSucceded = true;
   Form1.MessageContent= buttonYes.Text;
   this.DialogResult = DialogResult.OK;
   this.Close();
 }
 private void buttonNo_Click(object sender, EventArgs e)
 {
   Form1.MessageSucceded = true;
   Form1.MessageContent= buttonNo.Text;
   this.DialogResult = DialogResult.OK;
   this.Close();
 }
}

除了一个小细节外,这完全按照我的意图工作。就在消息框弹出之前,在一瞬间,消息框表单的终端版本打开,然后它自己关闭,windows窗体版本打开并按预期运行。我不明白为什么会发生这种情况,它也没有引起我注意到的任何性能问题,但从美学上看,它看起来非常糟糕。有人知道为什么会发生这种情况或者如何阻止它吗?我使用的是Visual Studio 2010 Express。谢谢你的帮助,感谢你花时间阅读这篇文章。

编辑:这是我的代码main:
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

自定义消息框类具有终端“弹出窗口”;当表单完成时

你调用了两次ShowDialog():

myForm.ShowDialog();
if (MessageSucceded = myForm.ShowDialog(this) == DialogResult.OK) {

表单已经关闭,所以它会立即关闭,正确的方法是保存它的第一个结果,并检查在您的if条件:

var result = myForm.ShowDialog();
if (MessageSucceded = (result == DialogResult.OK)) {

或直接:

MessageSucceded = myForm.ShowDialog() == DialogResult.OK;
if (MessageSucceded) {

此外,如果你根据点击按钮返回不同的结果,那么你不需要比较MessageContent(这也是一个坏主意,有一个引用调用者只是返回一个结果):

private void buttonYes_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Yes;
    this.Close();
}
 private void buttonNo_Click(object sender, EventArgs e)
 {
    this.DialogResult = DialogResult.No;
    this.Close();
 }

请注意,现在您可以简单地删除这样的代码,并添加适当的DialogResult属性到每个按钮(因为分配Form.DialogResult和调用Form.Close()是默认行为,如果分配Button.DialogResult属性)。完成后,您可以简单地像这样使用它:

switch (myForm.ShowDialog())
{
    case DialogResult.Yes:
        break;
    case DialogResult.No:
    case DialogResult.Cancel: // Unless ControlBox is also Hidden
        break;
}

最后一点:如果你的目标是Vista+,你也可以检查任务对话框,而不是写一个自定义表单(你可以保留它作为XP用户的后备)。