65.9K
CodeProject 正在变化。 阅读更多。
Home

Telerik WPF 控件的 RadMessageBox

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (7投票s)

2011年3月4日

CPOL

5分钟阅读

viewsIcon

58729

downloadIcon

2614

为 Telerik WPF 控件库实现的 MessageBox,遵循 WPF 标准 MessageBox 实现的设计模式。

引言

Telerik 发布了一套专业的 .NET GUI 组件,即 Telerik Ultimate Collection for .NET。

本文及附带的源代码实现了一个 RadMessageBox 类,它使用了与 Microsoft 开发团队实现的原始 WPF MessageBox 相同的开发风格。

背景

我公司前段时间购买了 Telerik Ultimate Collection for .NET。当我对我们的一些 WPF 应用程序进行重构,使用 Telerik WPF 控件时,我不得不更换一些标准的 .NET 消息框,以摆脱标准的 WPF GUI 风格。

Telerik 库提供了一个 Alert 消息框、一个 confirm 消息框和一个 prompt 消息框。在将它们集成到应用程序时,我发现有两件事我想以稍微不同的方式实现。

第一件事是,通过 RadWindow.Alert() 方法显示的 Rad 消息框总是居中显示在主屏幕上。如果你的应用程序只使用一个屏幕,这没问题,但现代化的专业软件产品应该利用不止一个屏幕。

这个问题在 这个 Telerik 论坛帖子中进行了讨论。

我希望消息框能居中显示在其所有者窗口,而不是将消息框显示在主 GUI 窗口所在的屏幕上。

查看标准的 WPF MessageBox 时,可以通过将引用作为重载的 static Show 方法的第一个参数来设置所有者窗口,该方法属于 MessageBox

你可以在 这里 找到 MessageBox 的 MSDN 文档。

RadWindow.Alert(...) 方法没有提供设置所有者窗口的方法,也没有提供获取和配置底层 RadWindow 实例的解决方案。

第二件事是,Telerik 的 Alert 和 Notify 对话框的实现方式与原始 WPF 消息框不同。

Telerik 库引入了 DialogParameters 类来进一步配置消息框,但目前没有设置所有者窗口的方法。

这意味着在重构应用程序时,你需要为 MessageBox 的每一次出现更改代码。

因此,我决定实现一个新的 RadMessageBox 类来扩展 Telerik 库。我希望消息框能居中显示在其所有者窗口,并且方法签名与标准的 WPF 消息框相似。

类描述

该类是一个小而简单的 RadWindow ,它实现了两个属性,用于定义窗口上显示的图像和按钮。由于这是一个普通的 RadWindow,它可以像任何其他窗口一样打开,或者通过使用 static Show 方法打开,其参数列表与标准 WPF 消息框实现的参数列表相同。

此方法的实现如下:

/// <summary>
/// Show a modal rad alert box
/// This static method was implemented following the Microsoft pattern 
/// for the standard WPF MessageBox
/// but is using the telerik RadWindow internally
/// </summary>
/// <param name="ctrlOwner">The owner window if needed otherwise null</param>
/// <param name="strMessage">The message to display</param>
/// <param name="strCaption">The title of the message box window. 
/// (Parameter is optional)</param>
/// <param name="button">The buttons the dialog should have - Default is ok</param>
/// <param name="image">The image the dialog should hold - Default is Warning</param>
/// <returns>A message box result enum with the result of the dialog</returns>
public static MessageBoxResult Show(ContentControl ctrlOwner, string strMessage, 
string strCaption = null, MessageBoxButton button = MessageBoxButton.OK, 
MessageBoxImage image = MessageBoxImage.Warning)
{
    try
    {
      RadMessageBox dlg = new RadMessageBox();
      dlg.DialogImage = image;
      dlg.Buttons = button;
                
      if(strCaption != null)
        dlg.Header = strCaption;

      dlg.txtMessage.Text = strMessage;

      if (ctrlOwner != null)
      {
        dlg.Owner = ctrlOwner;
      }

      dlg.ShowDialog();

      MessageBoxResult res = dlg.Result;
      return (res);
    }
    catch (Exception err)
    {
      System.Diagnostics.Trace.TraceError(err.ToString());
      return (MessageBoxResult.None);
    }
}

正如你所见,static 方法只是使用对话框实例来显示消息。

此方法的第一参数是 ContentControl 引用,即消息框的所有者窗口。
由于这是一个 ContentControl 引用,而不是一个简单的 Window RadWindow 引用,所以你可以使用这两种类型的窗口作为所有者。

第二个参数是要在消息框中显示的文本消息。

第三个参数是消息框应具有的窗口标题。此参数对默认值为 null

第四个参数是消息框应显示的按钮类型。我使用了 MessageBoxButton 枚举,以便使函数签名与标准 WPF MessageBox 保持一致。
枚举可以是下表中列出的值之一,可以在 MSDN 网站 上找到。

成员名称 描述
好的

消息框包含一个 OK 按钮。

这是默认参数。

确定取消 消息框包含 OK 和 Cancel 按钮。
中止重试忽略 消息框包含 Abort、Retry 和 Ignore 按钮。
是/否/取消 消息框包含 Yes、No 和 Cancel 按钮。
是/否 消息框包含 Yes 和 No 按钮。
重试取消 消息框包含 Retry 和 Cancel 按钮。

第五个参数是要显示的 消息框图像。同样,使用了标准 .NET MessageBoxImage 枚举来实现一个与标准实现可比的方法签名。

枚举名称和对话框上显示的图标可以在下表中看到:

成员名称 图标
none.png
Hand stop.png
提问 question.png
Exclamation Warning.png
Asterisk information.png
停止 stop.png
Error(错误) stop.png

警告

这是默认参数。
Warning.png
信息 information.png

正如你在上面的表格中看到的,消息框图标有时对于不同的枚举名称是相同的。这不是 bug 或错误。如果我们查看这个 Microsoft 枚举的定义,我们会发现其中一些枚举名称的值是相同的。

namespace System.Windows
{
    public enum MessageBoxImage
    {
        None = 0,
        Error = 16,
        Hand = 16,
        Stop = 16,
        Question = 32,
        Exclamation = 48,
        Warning = 48,
        Asterisk = 64,
        Information = 64,
    }
}

Using the Code

要使用该类,只需将附加代码中的 /bin/Release 目录下的 RadWrapper.dll 程序集添加到你的项目中。请注意,该类使用了 RadWindow 基类,它是 Telerik WPF 控件库 的一部分。这意味着你需要在你的系统上安装 Telerik WPF 控件库。

一旦添加到你的项目中,你就可以像使用 WPF 库的标准版本一样使用 RadMesssageBox

要显示一个带有信息图标和仅一个 OK 按钮的消息框,你的 Show 方法调用将如下所示,前提是当前对象(this)是标准的 Window RadWindow

RadMessageBox.Show(this, "My Message", "Window title", 
    MessageBoxButton.OK, MessageBoxImage.Information);

要使用消息框进行确认提问,你可以使用 static Show 方法的返回值,这是一个标准的 MessageBoxResult 枚举。

此枚举可以是下表中显示的值之一,可以在 MSDN 库页面上找到。

成员名称 描述
消息框不返回任何结果。
好的 消息框的结果值为 OK。.
取消 消息框的结果值为 Cancel。
消息框的结果值为 Yes。
消息框的结果值为 No。

结论

Telerik 团队在实现其库时做得非常出色。本项目中的类旨在加快将 Telerik 库集成到项目中的重构工作速度。

该类是使用 Telerik WPF 控件库的 Q2 和 Q3 2010 版本实现的并经过测试的。

© . All rights reserved.