首先是普通样式: ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    接着是显示图形样式:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    使用新的样式风格:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    首先请下载本文中的源码(本人已部分修改了原文中的源码和相应的样式,以便进行DEMO演示)。下面是相ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
应的类图和说明:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    接下来,将会以这个类图来逐个解释相应类结构信息,首先看一下MessageBoxControls(相应内容见注释):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// 消息框结果ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public enum MessageBoxResultŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    Yes,  //是ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    No,   //否ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    Cancel //取消ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// 消息事件参数ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public class MessageBoxResultEventArgs : EventArgsŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public MessageBoxResult Result { get; set; }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public object AsyncState { get; set; }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// 消息框控件类,该模板包括三个组件(三个Button和一个Panel)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
[TemplatePart(Name = RootElement, Type = typeof(Panel))]ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
[TemplatePart(Name = YesButtonElement, Type = typeof(Button))]ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
[TemplatePart(Name = NoButtonElement, Type = (typeof(Button)))]ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
[TemplatePart(Name = CancelButtonElement, Type = (typeof(Button)))]ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public class MessageBoxControl : ContentControlŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public event EventHandler MessageBoxDismissed;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public MessageBoxControl()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        DefaultStyleKey = typeof(MessageBoxControl);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public override void OnApplyTemplate()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        #region 取消之前的事件绑定ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (yesButton != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            yesButton.Click -= OnYesButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (noButton != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            noButton.Click -= OnNoButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (cancelButton != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            cancelButton.Click -= OnCancelButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        #endregionŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        rootElement = base.GetTemplateChild(RootElement) as Panel;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        yesButton = base.GetTemplateChild(YesButtonElement) as Button;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        noButton = base.GetTemplateChild(NoButtonElement) as Button;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        cancelButton = base.GetTemplateChild(CancelButtonElement) as Button;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        #region 如果grid中有相应元素时,则绑定相应事件(详见下面的代码)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (yesButton != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            yesButton.Click += OnYesButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (noButton != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            noButton.Click += OnNoButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (cancelButton != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            cancelButton.Click += OnCancelButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        #endregionŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void OnYesButton(object sender, EventArgs args)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        FireDismissed(MessageBoxResult.Yes);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void OnNoButton(object sender, EventArgs args)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        FireDismissed(MessageBoxResult.No);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void OnCancelButton(object sender, EventArgs args)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        FireDismissed(MessageBoxResult.Cancel);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 调用绑定的事件,并传递相应参数ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void FireDismissed(MessageBoxResult result)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //当绑定的事件不为空时(绑定部分参见MessageBox的构造函数)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (MessageBoxDismissed != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            MessageBoxDismissed(this, new MessageBoxResultEventArgs() { Result = result });ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    Button yesButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    Button noButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    Button cancelButton;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    Panel rootElement;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    #region 赋值信息参见generic.xaml中的"x:Name"声明ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public const string RootElement = "RootElement";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public const string YesButtonElement = "YesButtonElement";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public const string NoButtonElement = "NoButtonElement";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public const string CancelButtonElement = "CancelButtonElement";ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    #endregionŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
而MessageBox这个控件使用封装类结构如下(相关内容见注释):ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public class UserControlContentAccessor : UserControlŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 获取当前UserControl的ContentProperty属性ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 当前UserControlŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ContentProperty属性ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static UIElement GetContent(UserControl uc)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        return ((UIElement)uc.GetValue(UserControl.ContentProperty));ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 设置当前UserControl的ContentProperty属性ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 当前UserControlŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 要设置的内容属性ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static void SetContent(UserControl uc, UIElement element)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        uc.SetValue(UserControl.ContentProperty, element);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// 消息框类,该类可以看成是对"消息框控件类"使用封装(封装了事件绑定和内容信息)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public static class MessageBoxŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
/// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 实际页面视图中的元素(用于当消息框关闭后,还原页面元素时使用)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    private static UIElement realVisual;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 用于绑定当前页面中根元素节点ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    private static Grid parentGrid;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 状态值ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    private static object asyncState;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// 用户绑定回调事件属性ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    /// ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    private static EventHandler userCallback;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static void ShowAsync(object content)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ShowAsync(content, null);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static void ShowAsync(object content,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
      EventHandler callback)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ShowAsync(content, null, callback);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static void ShowAsync(object content, object userState,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
      EventHandler callback)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ShowAsync(content, userState, callback, null);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static void ShowAsync(object content, object userState,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
      EventHandler callback, Style controlTemplate)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        MessageBoxControl control = new MessageBoxControl();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        control.Content = content;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //绑定指定样式ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (controlTemplate != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            control.Style = controlTemplate;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ShowAsync(control, userState, callback);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    public static void ShowAsync(MessageBoxControl control, object userState,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
      EventHandler callback)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        UserControl uc = Application.Current.RootVisual as UserControl;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (uc != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            asyncState = userState;//用户状态绑定ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            userCallback = callback;//回调方法ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            realVisual = UserControlContentAccessor.GetContent(uc);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            realVisual.IsHitTestVisible = false; //使底层控件点击不可见ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            parentGrid = new Grid();//声明一个Grid对象,用于加载新的内容ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            UserControlContentAccessor.SetContent(uc, parentGrid);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            parentGrid.Children.Add(realVisual); //加载realVisual内容(注:此处内容中的控制已不支持点击了)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            parentGrid.Children.Add(control); //加载消息框实例,后加载的显示在上(前)面ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            control.MessageBoxDismissed += OnDismissed; //绑定要处理的事件,该事件会在点击消息框中的"yes"或"no"按钮时执行ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    static void OnDismissed(object sender, MessageBoxResultEventArgs e)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        MessageBoxControl control = sender as MessageBoxControl;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        UserControl uc = Application.Current.RootVisual as UserControl;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (uc != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {  //清除之前的页面UI元素,并还原页面初始时的元素设置ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            parentGrid.Children.Clear();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            realVisual.IsHitTestVisible = true;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            UserControlContentAccessor.SetContent(uc, realVisual);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        if (control != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            control.MessageBoxDismissed -= OnDismissed;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        tryŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            if (userCallback != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                //执行用户绑定的事件(并传递事件参数)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                userCallback(null, new MessageBoxResultEventArgs()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    Result = e.Result,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    AsyncState = asyncStateŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                });ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        finallyŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            realVisual = null;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            parentGrid = null;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            asyncState = null;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            userCallback = null;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
其实通过上面的类,我们可以看出作者是如何在当前页面中显示消息框信息的,也就是上面代码段里ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
的如下代码:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  realVisual = UserControlContentAccessor.GetContent(uc);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  realVisual.IsHitTestVisible = false; //使底层控件点击不可见ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  parentGrid = new Grid();//声明一个Grid对象,用于加载新的内容ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  UserControlContentAccessor.SetContent(uc, parentGrid);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  parentGrid.Children.Add(realVisual); //加载realVisual内容(注:此处内容中的控制已不支持点击了)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
  parentGrid.Children.Add(control); //加载消息框实例,后加载的显示在上(前)面
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
也就是通过realVisual来保存原有的页面元素信息,然后重新按指定顺序(先realVisual再messagecontrol)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
加载UIElement来实现显示消息框的方式,当然这种有HACK味道的做法到底效果好不好,连原作者都表示怀疑,他ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
本人也感觉还应有更好的Solution。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    当然realVisual变量的一个重要用处在于当消息框被关闭时,用它来还原页面中的元素,而这块代码就是上面ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
所说的OnDismissed方法所做的事了,代码如下:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
OnDismissed (object sender, MessageBoxResultEventArgs e)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    MessageBoxControl control = sender as MessageBoxControl;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    UserControl uc = Application.Current.RootVisual as UserControl;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    if (uc != null)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {  //清除之前的页面UI元素,并还原页面初始时的元素设置ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        parentGrid.Children.Clear();ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        realVisual.IsHitTestVisible = true;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        UserControlContentAccessor.SetContent(uc, realVisual);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
这样,我们可以在应用程序中使用该类来显示相应的消息框了,其声明和使用代码如下:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
//普通样式ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void OnNormalClick(object sender, EventArgs args)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        MessageBox.ShowAsync("简单调用, 无回调, 无状态, 无样式!");ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //下面注释的代码包括状态和回调事件 ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //MessageBox.ShowAsync("As previously but with a callback - hit NO", (s, e) =>ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //  {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //    Debug.Assert(e.Result == MessageBoxResult.No);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //  });ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //MessageBox.ShowAsync("As previously but with state - hit YES", 101, (s, e) =>ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //  {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //    Debug.Assert((e.Result == MessageBoxResult.Yes) && ((int)e.AsyncState == 101));ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        //  });        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
//显示图形ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void OnShapeClick(object sender, EventArgs args)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        MessageBox.ShowAsync(new Ellipse()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            Width = 80,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            Height = 80,ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            Fill = new SolidColorBrush(Colors.Green)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        });ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }  ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    //转换样式ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    void OnChangeStyleClick(object sender, EventArgs args)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        Style myStyle = this.Resources["myStyle"] as Style;ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
        MessageBox.ShowAsync("使用一个不同的样式",ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            101,//状态ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            (s, e) => //处理事件ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                if (e.Result == MessageBoxResult.No && ((int)e.AsyncState == 101))ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    HtmlPage.Window.Alert("您点击了No按钮");ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                if (e.Result == MessageBoxResult.Yes)ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                {ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                    HtmlPage.Window.Alert("您点击了Yes按钮");ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
                }ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
            },ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
          myStyle);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    }
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
说到这里,还有一个内容没有介绍,也就是作者所定义的两个样式文件,其中之一被放置到了generic.xamlŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
中,以便做了控制默认加载样式,其绑定直接在MessageBoxControl构造函数中完成,如下:ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
public MessageBoxControl()ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
{ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
    DefaultStyleKey = typeof(MessageBoxControl);ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
}
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
而另外的样式被放在了page.xaml中,以便于程序运行时访问,这里就不多作介绍了。不过本人已修改了这两ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š
个样式中的一些数值,主要是为了显示时比例更好看一些。ŒÖ’îO)\buRwww.netcsharp.cnÔ¯óã¿<š