

在本文,我将想你展示如何在Silverlight3创建自定义messagebox用户控件,以便你能在任何Silverlight应用中使用它替换默认的messagebox
为了能够完成本教程,你应该了解一些有关Microsoft Expression Blend,我们将使用在MessageBox创建用户控件。我假设您正在使用Expression Blend,而且熟悉它的UI
毫无疑问,在任何应用里无论它是桌面还是WEB,messagebox控件都被大规模使用,因为你需要向询问用户一些东西,警告一些危险操作,或者 显示一些信息给用户等等。控件必须非常灵活处理所有这些情况。而且,它必须是一个模式对话框这将阻止访问页面背景,直到用户关闭对话框。
开始Expression Blend和选择控件库项目模板(以生成一个DLL,以便它可以添加到任何Silverlight应用程序),然后从您的解决方案MainControl 用户控件,并添加一个新的子窗口。这孩子窗口将会被打开一个模式对话框,因此我们现在可以改变儿童的窗口样式,使其像看屏幕快照。
在对象和时间线面板,在ChildWindow节点右键,然后选择编辑模板,然后编辑复制。现在,我们将能够自定义子窗口布局,以符合我们的要求。你会认识到,第五边境是最重要的一项,包括所有的UI元素。

展开第五边界控制和选择铬节点;铬节点是在MessageBox头,所以我们要改变它的背景色的渐变画笔使用使用以下XAML代码:

在完成头风格,我们要添加背景图像给它一个更好的外观,因此在网格中添加承载铬元素,或者你可以调整该网格的背景颜色的图像,所以它最多您。
在这一点上,我们完成我们的习惯这些URL的风格布局,但我们要显示文字信息,并添加一些按钮到这些URL的机构,所以回到childwindow我们将增加下列项目:
1。TextBlock元素,以显示文本信息给用户。
2。形象元素,显示图标的消息根据用户的选择。
3。 butto3 - 3键(是,否和取消),但用户可能要显示只限于2个按钮(是和否)或可能只是一个(玉),所以我们将分组到一个StackPanel中他们以使他们在对话为中心。
因此,最终用户界面看起来应该像树的对象和时间线面板的:

到目前为止,我们已经完成了所有的用户控件的设计工作,所以让我们为用户增加一些选项。我们将增加两个在我们的命名空间枚举 (MessageBoxButtons&MessageBoxIcon),以使用户能够选择正确的消息类型,例如他/她可能要显示一条错误信息,所以我们 应该显示错误图标该消息。
public enum MessageBoxButtons { Ok, YesNo, YesNoCancel, OkCancel }
public enum MessageBoxIcon { Question, Information, Error, None, Warning }
最后一件事,我们想知道是哪个按钮被用户点击,大约使公共法展(字符串消息,串题),它返回完全一样,在Windows窗体MessageBox类 的DialogResult那又怎么样呢?可惜,这并不适用,因为在Silverlight窗口,形成在MessageBox等待从用户的反应,使程序可 以完成处理,但是这不是在Silverlight同一案件。模态对话框将打开,并在剩下的代码会被执行的很好,所以应用程序不等待用户关闭对话框,以完成 其工作。为了克服这个问题,我们将要处理的MessageBox控件关闭事件,使我们可以知道点击按钮。
我宣布一个参数类型MessageBoxResult委托功能,以了解哪一个按钮被点击。
//delegate to get the selected MessageBoxResult
public delegate void MessageBoxClosedDelegate(MessageBoxResult result);
//event will be fired in the Close event of the usercontrol
public event MessageBoxClosedDelegate OnMessageBoxClosed;
//property to keep the result of the messagebox
public MessageBoxResult Result { get; set; }
private void MessageBoxChildWindow_Closed(object sender, EventArgs e)
{
if (OnMessageBoxClosed != null)
OnMessageBoxClosed(this.Result);
}
首先,您需要添加这个类库生成的DLL任何Silverlight应用程序。子窗口类有一个公共的方法称为“展()”,因此我们将使用在 MessageBox开放,但我们要设置其标题,文字信息,图标和按钮的数目是根据用户的选择,所以我们可以无论是通过发送一个公共方法,或通过对这些参 数的构造函数重载,我选择了第二选择,创造了另一个默认的构造函数重载和通过它的参数,因此使用下面的代码以打开这些URL:
//displayed message
string msg = "An error has occurred and the operation was cancelled,
Are you sure you want to continue?";
//creating new instance from the MessageBoxControl
MessageBoxControl.MessageBoxChildWindow w =
new MessageBoxControl.MessageBoxChildWindow("Error", msg,
MessageBoxControl.MessageBoxButtons.YesNo,
MessageBoxControl.MessageBoxIcon.Error);
//define the close event handler for the control
w.OnMessageBoxClosed +=
new MessageBoxControl.MessageBoxChildWindow.MessageBoxClosedDelegate
(w_OnMessageBoxClosed);
//open the message
w.Show();
我附加了测试应用程序显示在MessageBox动态,让您可以测试它的全部功能。