我正在尝试使用我的控件制作自定义消息框。
public static partial class Msg : Form
{
public static void show(string content, string description)
{
}
}
实际上我需要在这个窗体中放置一些控件(gridview),我必须在这个窗口中应用我自己的主题,所以我不想使用MessageBox
。我想从我的其他形式(如
Msg.show(parameters);
我不希望为此表单创建一个对象。
我知道我不能从Form
类继承,因为它不是静态的。但我想知道MessageBox
是如何实现的,因为它是静态的。它被称为MessageBox.show("Some message!");
现在我收到错误,因为不允许继承:
静态类'MyFormName'无法从类型'System.Windows.Forms.Form'派生。静态类必须派生自对象
如何实施MessageBox
?
答案 0 :(得分:21)
您的表单类不必是static
。事实上,一个静态类根本无法继承。
相反,创建一个internal
表单类,该类派生自Form
并提供public static
辅助方法来显示它。
如果您不希望调用者甚至“知道”基础表单,则可以在不同的类中定义此静态方法。
/// <summary>
/// The form internally used by <see cref="CustomMessageBox"/> class.
/// </summary>
internal partial class CustomMessageForm : Form
{
/// <summary>
/// This constructor is required for designer support.
/// </summary>
public CustomMessageForm ()
{
InitializeComponent();
}
public CustomMessageForm (string title, string description)
{
InitializeComponent();
this.titleLabel.Text = title;
this.descriptionLabel.Text = description;
}
}
/// <summary>
/// Your custom message box helper.
/// </summary>
public static class CustomMessageBox
{
public static void Show (string title, string description)
{
// using construct ensures the resources are freed when form is closed
using (var form = new CustomMessageForm (title, description)) {
form.ShowDialog ();
}
}
}
附注:作为Jalal points out,您无需创建课程static
即可拥有static
个方法。但我仍然会将“帮助器”类与实际表单分开,这样调用者就无法使用构造函数创建表单(除非它们当然在同一个程序集中)。
答案 1 :(得分:7)
我刚刚为MessageBox编写了一个单独的文件替换,这是一个很好的例子,如何“模仿”MessageBox的静态接口。您可以在此处下载并像标准MessageBox一样使用它:
http://www.codeproject.com/Articles/601900/FlexibleMessageBox-A-flexible-replacement-for-the
问候,Jörg
答案 2 :(得分:5)
您不需要该类是静态的。 做一些像:
public partial class Msg : Form
{
public static void show(string content, string description)
{
Msg message = new Msg(...);
message.show();
}
}
答案 3 :(得分:2)
您不需要创建类static
以便静态调用其中一个方法 - 将特定方法声明为static
就足够了。
public partial class DetailedMessageBox : Form
{
public DetailedMessageBox()
{
InitializeComponent();
}
public static void ShowMessage(string content, string description)
{
DetailedMessageBox messageBox = new DetailedMessageBox();
messageBox.ShowDialog();
}
}
我们正在使用messageBox.ShowDialog()
将表单显示为模态窗口。您可以使用DetailedMessageBox.ShowMessage("Content", "Description");
显示消息框。
顺便说一句,你应该重新考虑你的命名并坚持一致的命名模式。 Msg
和show
是与Naming Guidelines不匹配的弱名称 - 您肯定想要查看这些名称!
答案 4 :(得分:-1)
在WPF项目中,您可以添加一个新窗口并将其命名为MessageBoxCustom,然后在C#中找到Void,您可以在其中找到InitialiseComponent();添加2个属性并将这些属性绑定到您应该在XAML视图中创建的textBlocks 例如:
public MessageBoxCustom(string Message, string Title)
{
InitialiseComponent();//this comes first to load Front End
textblock1.Text = Title;
textblock2.Text = Message;
}
Just position your TextBlocks where you want them to be displayed in XAML
From your Main Window you can call that message box like this
private void Button_Click()
{
MessageBoxCustom msg = new MessageBoxCustom("Your message here","Your title her");
msg.ShowDialog();
}