Needed a MessageBox type control, so implemented one. Thought I would post it here to see if anyone can make improvements.
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using DigitalRune;
using DigitalRune.Game.UI;
using DigitalRune.Mathematics.Algebra;
namespace DigitalRune.Game.UI.Controls
{
public enum MessageBoxButton
{
OK = 0,
OKCancel,
YesNo,
YesNoCancel,
}
public enum MessageBoxResult
{
OK,
Cancel,
Yes,
No
}
public class ResponseEventArgs : EventArgs
{
private MessageBoxResult _result;
public MessageBoxResult Result
{
get { return _result; }
}
public ResponseEventArgs(MessageBoxResult type)
{
_result = type;
}
}
public class MessageBox : Window
{
private static int MaximumWidth = 300;
#region Button entries
private class MessageBoxButtonEntry
{
private string _text;
private MessageBoxResult _result;
public string Text
{
get { return _text; }
}
public MessageBoxResult Result
{
get { return _result; }
}
public MessageBoxButtonEntry(string text, MessageBoxResult result)
{
_text = text;
_result = result;
}
}
private static MessageBoxButtonEntry[][] _entries = new MessageBoxButtonEntry[][]
{
new MessageBoxButtonEntry[] { new MessageBoxButtonEntry("Okay", MessageBoxResult.OK), },
new MessageBoxButtonEntry[] { new MessageBoxButtonEntry("Okay", MessageBoxResult.OK),
new MessageBoxButtonEntry("Cancel", MessageBoxResult.Cancel), },
new MessageBoxButtonEntry[] { new MessageBoxButtonEntry("Yes", MessageBoxResult.Yes),
new MessageBoxButtonEntry("No", MessageBoxResult.No), },
new MessageBoxButtonEntry[] { new MessageBoxButtonEntry("Yes", MessageBoxResult.Yes),
new MessageBoxButtonEntry("No", MessageBoxResult.No),
new MessageBoxButtonEntry("Cancel", MessageBoxResult.Cancel), },
};
#endregion
public event EventHandler Response;
public MessageBox(string message, string title, MessageBoxButton button) : this(message, title, button, null)
{
}
public MessageBox(string message, string title, MessageBoxButton button, Texture2D icon)
{
Title = title;
CanDrag = false;
IsModal = true;
CloseButtonStyle = null;
HorizontalAlignment = HorizontalAlignment.Center;
VerticalAlignment = VerticalAlignment.Center;
var mainPanel = new StackPanel
{
Margin = new Vector4F(12, 12, 12, 12),
};
var messagePanel = new StackPanel
{
Orientation = Orientation.Horizontal,
HorizontalAlignment = HorizontalAlignment.Center,
};
var buttonPanel = new StackPanel
{
Orientation = Orientation.Horizontal,
HorizontalAlignment = HorizontalAlignment.Center,
Margin = new Vector4F(0, 5, 0, 0),
};
#region Icon & Message
var messageBlock = new TextBlock
{
Text = message,
Margin = new Vector4F(4),
HorizontalAlignment = HorizontalAlignment.Center,
MaxWidth = MessageBox.MaximumWidth,
WrapText = true,
Foreground = Color.White,
};
if (icon != null)
{
var messageIcon = new Image
{
Width = 32,
Height = 32,
Margin = new Vector4F(0, 0, 4, 0),
VerticalAlignment = VerticalAlignment.Top,
HorizontalAlignment = HorizontalAlignment.Center,
Texture = icon,
};
messagePanel.Children.Add(messageIcon);
}
messagePanel.Children.Add(messageBlock);
#endregion
#region Buttons
foreach (MessageBoxButtonEntry entry in _entries[(int)button])
{
var entryButton = new Button()
{
Content = new TextBlock { Text = entry.Text },
Tag = entry.Result,
Margin = new Vector4F(4, 0, 4, 0),
Padding = new Vector4F(8, 5, 8, 5),
HorizontalAlignment = HorizontalAlignment.Center,
};
entryButton.Click += InvokeResponse;
buttonPanel.Children.Add(entryButton);
}
#endregion
mainPanel.Children.Add(messagePanel);
mainPanel.Children.Add(buttonPanel);
Content = mainPanel;
}
public void InvokeResponse(object sender, EventArgs e)
{
var button = sender as Button;
if (button == null)
return;
Close();
var args = new ResponseEventArgs((MessageBoxResult)button.Tag);
if (Response != null)
Response(this, args);
}
}
}
Feel free to modify as you wish.