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

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

  首先是普通样式:

 


     接着是显示图形样式:

     使用新的样式风格:


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

应的类图和说明:

 



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

Code

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

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中,以便于程序运行时访问,这里就不多作介绍了。不过本人已修改了这两
个样式中的一些数值,主要是为了显示时比例更好看一些。


     好了,今天的内容就先到这里了。

     tag : silverlight,messagexbox
     作者: 代震军, daizhj
     原帖链接: http://files.cnblogs.com/daizhj/silverlight_MessageBox.rar
posted on 2008-08-27 11:47 代震军 阅读(3469) 评论(12) 编辑 收藏

FeedBack:
2008-08-27 11:57 | 斯克迪亚      
这看起来很不错,谢谢分享。
 回复 引用 查看   
2008-08-27 12:18 | 真见      
在silverlight live上存的东西也不少,就是写不出来。。
 回复 引用 查看   
#3楼[楼主]
2008-08-27 12:24 | 代震军      
@斯克迪亚
呵呵:)

 回复 引用 查看   
#4楼[楼主]
2008-08-27 12:25 | 代震军      
@真见
silverlight live上的应用是很不错:)

 回复 引用 查看   
2008-08-27 12:52 | Windie Chai(笑煞天)      
谢谢分享。
 回复 引用 查看   
#6楼[楼主]
2008-08-27 13:09 | 代震军      
@Windie Chai(笑煞天)
:)

 回复 引用 查看   
2008-08-27 14:36 | cloudgamer      
没试过silverlight
好像很强大呢

 回复 引用 查看   
#8楼[楼主]
2008-08-27 16:06 | 代震军      
@cloudgamer
估计10月份该出正式版了,到时您可以尝试一下:)

 回复 引用 查看   
2008-08-28 09:19 | 韩[未注册用户]
很受教,谢谢楼主
 回复 引用   
#10楼[楼主]
2008-08-28 10:17 | 代震军      
@韩
:)

 回复 引用 查看   
2008-08-28 16:53 | Forrest lll[未注册用户]
你的控件能拖动吗?你能保证弹出你的控件后页面中的其他控件不能操作吗?我看够呛。。没我写的好
 回复 引用   
#12楼[楼主]
2008-08-29 09:06 | 代震军      
@Forrest lll
控件(窗口)拖动的问题很好解决,园子里就有这方面的文章(好像是李会军写的)。
而“其他控件不能操作”的问题在原文中是把一个按钮在下面最大化显示(100%那种),而当消息框弹出后,下面的按钮是无法再点击使用的,这个就是通过上面所说的realVisual.IsHitTestVisible = false;实现了。

当然如果您认为有更好的实现,不妨放出来,让大家一块研究学习,呵呵:)


 回复 引用 查看   
昵称:代震军
园龄:5年11个月
荣誉:推荐博客
粉丝:492
关注:3

<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

搜索

 
 

常用链接

随笔分类(366)

随笔档案(283)

文章分类(8)

文章档案(31)

相册

JavaScript

LINQ

silverlight

UML,OO

WebBlogger

负载开源项目

  • Discuz!NT
  • LLServer
  • TokyoTyrantClient
  • WebCam

个人简历

漫画

其它

企业级架构

网站案例研究

积分与排名

  • 积分 - 1217876
  • 排名 - 26

最新评论

阅读排行榜

评论排行榜

推荐排行榜