C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Arguments: The first arguments are for the title, heading, text and buttons. If you want a button not to appear, pass in null instead of a string.
Button: It has a default button. In my implementation, the first button is always the default and it is also the confirm button.
ButtonImplementation of ShowDialog: C#
/// <summary>
/// This method is part of the dialog.
/// </summary>
static public DialogResult ShowDialog(string title,
string largeHeading,
string smallExplanation,
string leftButton,
string rightButton,
Image iconSet)
{
// Call the private constructor so the users only need to call this
// function, which is similar to MessageBox.Show.
// Returns a standard DialogResult.
using (BetterDialog dialog = new BetterDialog(title, largeHeading,
smallExplanation, leftButton, rightButton, iconSet))
{
DialogResult result = dialog.ShowDialog();
return result;
}
}
/// <summary>
/// This is the calling convention of the above method.
/// Use this to show a custom dialog in your source code.
/// </summary>
private void ExampleCall()
{
DialogResult result = BetterDialog.ShowDialog("Reset Journal Settings",
"Settings will be erased permanently",
"This will not affect any of the text content in the database.",
"Reset", "Cancel", Properties.Resources.DialogWarningXP);
if (result == DialogResult.OK)
{
Console.WriteLine("User accepted the dialog");
}
}
Finally: It returns a standard DialogResult, which you can test as normally by using DialogResult.OK or other enums on DialogResult.
DialogResultCreateGraphics: It uses this.CreateGraphics to get a Graphics object on the form. It useslogic with MeasureString and attempts to lay out the dialog.
Note: I had to find values that would lay out and position the elements properly. It also has a table layout, which simplifies the design.
TableLayoutPanel: The layout is done with 2 TableLayoutPanels, with a white background so that it can better match Windows' themes.
constTableLayoutPanelHiding: It can hide or show various parts. It will hide buttons you specify as null, and it will collapse and hide the text if you don't supply it.
Implementation of BetterDialog constructor: C#
/// <summary>
/// Use this with the above static method.
/// </summary>
private BetterDialog(string title,
string largeHeading,
string smallExplanation,
string leftButton,
string rightButton,
Image iconSet)
{
// Set up some properties.
this.Font = SystemFonts.MessageBoxFont;
this.ForeColor = SystemColors.WindowText;
InitializeComponent();
this.Width = 350;
this.Height = 150;
// Do some measurements with Graphics.
using (Graphics graphics = this.CreateGraphics())
{
SizeF smallSize;
SizeF bigSize;
if (string.IsNullOrEmpty(smallExplanation) == false)
{
// Note: at this point, we could detect that the OS is Vista
// and do some customizations. That logic is in the download.
// The code here does some measurements.
label1.Font = new Font(SystemFonts.MessageBoxFont.FontFamily.Name, 8.0f,
FontStyle.Bold, GraphicsUnit.Point);
smallSize = graphics.MeasureString(smallExplanation, this.Font,
this.label2.Width);
bigSize = graphics.MeasureString(largeHeading, label1.Font,
this.label1.Width);
this.Height = (int)smallSize.Height + 166;
double bigger = (smallSize.Width > bigSize.Width) ?
smallSize.Width : bigSize.Width;
this.Width = (int)bigger + 100;
}
else
{
// We have a null "smallExplanation", so we have a single message
// dialog. Do some different changes. Code omitted for brevity (you
// can find the logic in the download if you want to see it).
}
}
// Establish a minimum width.
if (this.Width < 260)
{
this.Width = 260;
}
// Set the title, and some Text properties.
this.Text = title;
label1.Text = largeHeading;
label2.Text = string.IsNullOrEmpty(smallExplanation) ?
string.Empty : smallExplanation;
// Set the left button, which is optional.
if (string.IsNullOrEmpty(leftButton) == false)
{
this.buttonLeft.Text = leftButton;
}
else
{
this.AcceptButton = buttonRight;
this.buttonLeft.Visible = false;
}
this.buttonRight.Text = rightButton;
// Set the PictureBox and the icon.
pictureBox1.Image = iconSet;
}
Tip: Rigorously test your code to make sure it doesn't embarrass you down the line.