自定义消息框类具有终端“弹出窗口”;当表单完成时
本文关键字:弹出窗口 窗口 完成时 表单 终端 自定义消息 | 更新日期: 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用户的后备)。