在silverlight中定制自己的MessageBox(消息框)

简介:
在silverlight中,如果想使用“消息框”可使用下面的方法,即:HtmlPage.Window.Alert("消息框内容")。如果想要显示更加复杂的内容或定义消息框样式的话,基本上没有什么好的方法。最近在网上看到了一篇文章,该文章的作者也谈到了上面所说的话题,相关链接如下:  
      The Curious Incident of the MessageBox in the Silverlight App 

     在线演示如下: [url]http://silverlight.services.live.com/invoke/72193/messagebox/iframe.html[/url]

   首先是普通样式:
 

      接着是显示图形样式:

      使用新的样式风格:


     首先请下载本文中的源码(本人已部分修改了原文中的源码和相应的样式,以便进行DEMO演示)。下面是相应的类图和说明:
 


     接下来,将会以这个类图来逐个解释相应类结构信息,首先看一下MessageBoxControls(相应内容见注释):

ContractedBlock.gif Code

     而MessageBox这个控件使用封装类结构如下(相关内容见注释):

ContractedBlock.gif Code

     其实通过上面的类,我们可以看出作者是如何在当前页面中显示消息框信息的,也就是上面代码段里
的如下代码:
  

  realVisual 
=  UserControlContentAccessor.GetContent(uc);
  realVisual.IsHitTestVisible 
=   false ;  // 使底层控件点击不可见

  parentGrid 
=   new  Grid(); // 声明一个Grid对象,用于加载新的内容
  UserControlContentAccessor.SetContent(uc, parentGrid);
 
  parentGrid.Children.Add(realVisual); 
// 加载realVisual内容(注:此处内容中的控制已不支持点击了)
  parentGrid.Children.Add(control);  // 加载消息框实例,后加载的显示在上(前)面

  

      也就是通过realVisual来保存原有的页面元素信息,然后重新按指定顺序(先realVisual再messagecontrol)加载UIElement来实现显示消息框的方式,当然这种有HACK味道的做法到底效果好不好,连原作者都表示怀疑,他
本人也感觉还应有更好的Solution。

     当然realVisual变量的一个重要用处在于当消息框被关闭时,用它来还原页面中的元素,而这块代码就是上面所说的OnDismissed方法所做的事了,代码如下:

OnDismissed ( object  sender, MessageBoxResultEventArgs e)
{

    MessageBoxControl control 
=  sender  as  MessageBoxControl;

    UserControl uc 
=  Application.Current.RootVisual  as  UserControl;

    
if  (uc  !=   null )
    {  
// 清除之前的页面UI元素,并还原页面初始时的元素设置
        parentGrid.Children.Clear();
        realVisual.IsHitTestVisible 
=   true ;
        UserControlContentAccessor.SetContent(uc, realVisual);
    }
    
}


    这样,我们可以在应用程序中使用该类来显示相应的消息框了,其声明和使用代码如下:
    
    
// 普通样式
     void  OnNormalClick( object  sender, EventArgs args)
    {        
        MessageBox.ShowAsync(
" 简单调用, 无回调, 无状态, 无样式! " );
        
// 下面注释的代码包括状态和回调事件 
        
// MessageBox.ShowAsync("As previously but with a callback - hit NO", (s, e) =>
        
//   {
        
//     Debug.Assert(e.Result == MessageBoxResult.No);
        
//   });

        
// MessageBox.ShowAsync("As previously but with state - hit YES", 101, (s, e) =>
        
//   {
        
//     Debug.Assert((e.Result == MessageBoxResult.Yes) && ((int)e.AsyncState == 101));
        
//   });        
    }
// 显示图形
     void  OnShapeClick( object  sender, EventArgs args)
    {
        MessageBox.ShowAsync(
new  Ellipse()
        {
            Width 
=   80 ,
            Height 
=   80 ,
            Fill 
=   new  SolidColorBrush(Colors.Green)
        });
    }  

    
// 转换样式
     void  OnChangeStyleClick( object  sender, EventArgs args)
    {
        
        Style myStyle 
=   this .Resources[ " myStyle " as  Style;

        MessageBox.ShowAsync(
" 使用一个不同的样式 " ,
            
101 , // 状态
            (s, e)  =>   // 处理事件
            {
                
if  (e.Result  ==  MessageBoxResult.No  &&  (( int )e.AsyncState  ==   101 ))
                {
                    HtmlPage.Window.Alert(
" 您点击了No按钮 " );
                }

                
if  (e.Result  ==  MessageBoxResult.Yes)
                {
                    HtmlPage.Window.Alert(
" 您点击了Yes按钮 " );
                }
            },
          myStyle);
    }
    
    
    说到这里,还有一个内容没有介绍,也就是作者所定义的两个样式文件,其中之一被放置到了generic.xaml中,以便做了控制默认加载样式,其绑定直接在MessageBoxControl构造函数中完成,如下:
  
public  MessageBoxControl()
{
    DefaultStyleKey 
=   typeof (MessageBoxControl);
}
    

    而另外的样式被放在了page.xaml中,以便于程序运行时访问,这里就不多作介绍了。不过本人已修改了这两个样式中的一些数值,主要是为了显示时比例更好看一些。



本文转自 daizhenjun 51CTO博客,原文链接:http://blog.51cto.com/daizhj/100968,如需转载请自行联系原作者

相关文章
|
5月前
14 MFC - 普通按钮 CButton
14 MFC - 普通按钮 CButton
20 0
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体-57
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体-57
EasyUI–消息框、对话框和窗体详解
本篇主要介绍信息提示框、对话框及窗体相关控件,这些都是最常用的页面弹出控件,使用一个详细的例子描述。 按惯例献上案例的示意图:
501 0
EasyUI–消息框、对话框和窗体详解
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体
146 0
VB编程:ReleaseCapture&SendMessage拖动无标题栏的窗体
|
C# Windows
Winform与WPF对话框(MessageBox, Dialog)之比较
原文:Winform与WPF对话框(MessageBox, Dialog)之比较 Winform:使用System.Windows.Forms命名空间中相应控件; WPF则调用Microsoft.Win32。
2421 0
|
C# 容器
WPF弹出带蒙板的消息框
原文:WPF弹出带蒙板的消息框 效果图   思路 拿到父级窗体的内容,放入一个容器里,再在容器里放入一个半透明层.将整个容器赋给父级窗体的内容. 关闭时反向操作.    代码 消息窗弹出时 1 /// 2 /// 弹出消息框 3 /// 4 /// ...
1486 0

热门文章

最新文章