silverlight:Silverlight的弹出窗口--展示

  本文举例源代码或素材下载

  背景   年后来到公司实习个星期没有项目也就无所事是此时有位前辈和我说他们有个系统是基于Silverlight研发而其中使用弹出窗口存在着不少问题因此如果可以要我做出个弹出窗口功能其子元素可以是自定义任何Control控件

  我很高兴进入公司才几天就能有这样任务次我去区别公司实习总是能在很短时间内被“委以重任(当然更多是我自己在自恋)”去进行可利用基础设施研发非常感谢从大 2开始都直如此信任和看得我各家公司我想只有在这样环境中才可以全力以赴……

  总的接下此任务情况是这样那么至此我对Silverlight到底有多少知识呢?答案是认识我人都知道我是非常非常没有美工水平因此对于几乎所有前台开发技术都敬而远的而其中如此新颖Silverlight更是令我望而生怯

  但是事已如此刚进公司也不能说我不会做于是就硬着头皮上了最终结果是这样:

  首先用半天时间基本撑握了Silverlight模型包括了解了Xaml语法如DependencyPropertyAttachedProeprty等基本熟悉了相关API至于Control控件树的类理念Winform和Webform也是基本相同模型因此熟悉起来也相对较快

  随后用半天时间折腾出了个弹出窗口原型看起来确实相当地舒服弹出个窗口再关闭弹出两个窗口再相继关闭并没有出现特别大问题

  然后5分钟时间内发现这东西并不完美存在着不少问题于是从架构上完全推倒了前作品很明显我实现是基于设计也因此需要将整个模型进行重新设计并进行再实现

  经过再半天努力终于有了个较为理想化设计并完成了这个版本实现

  我们选择   对于弹出窗口这样功能我们在Silverlight中是有多种选择在介绍我作品的前我们先来看下各种选择优点和缺点

  选择1:MessageBox   确实Silverlight中是有个MesasgeBox和Winform中MessageBox.Show即可但其也存在着不少问题当然在这的前我们要先向好方面看

  优点:MessageBox是同步即Show思路方法后可以直接取得返回值同步编程在简单性上相比异步编程有着非常大优势因此确实可以作为个好选择

  缺点:知道为什么各JS框架都要出个MessageBox么就是alert这东西实在太难看了而现在我们面对着更为绚丽Silverlight应用在赏心悦目地享受着同时难道要时不时看到个和alert窗口家伙弹出又消失?

  选择2:Popup   Popup是Silverlight基础类库提供个Control控件可以直接完成弹出功能

  优点:操作简单可以用Xaml表述封装了弹出功能样式可自定义作为官方解决方案甚为强大

  缺点:据前辈说Popup中包含有DataGrid的类复杂Control控件时候会有Bug出现这也是需要我去完全做个弹出窗口出来主要原因……

  我作品—PopupBox   我没有办法称的为MessageBox基础类库中有这东西

  我也没办法称的为Popup基础类库中也有这东西

  我可不想自己作品在出现的初就和基础类库有着冲突要求者必须使用全局命名空间引用更不想借用官方名字给人产生混淆感觉

  作为个作品展示先来看看这东西是如何使用事实上这并不是个Control控件而是个类因此你不能使用Xaml声明他作出这种决定原因是我对Xaml只是掌握并不熟悉因此如果要做到使用Xaml进行声明可能至今都看不到这家伙影子其次是弹出窗口往往是通过编程来动态确定其内容并控制是否弹出因此将的作为个类来使用也不会产生太大麻烦

  为了使用我们弹出窗口首先需要获取个称为PopupService对象其掌管着切弹出的物你不能显式地通过来构造个PopupService而必须通过工厂方式获取这个对象

  PopupService service = PopupService.GetServiceFor(LayoutRoot);

  随后我们可以使用多种重载从PopupService中通过GetBoxPage来获取弹出窗口例子其第个参数是显示在弹出窗口中Control控件类型为FrameworkElement第 2个参数为窗口标题后面参数控制着诸如是否可以拖动是否显示关闭图标等功能如下

BoxPage box = service.GetBoxPage(
   MyControl, //显示Control控件
  Title.Text, //标题
  true, //是否可以拖动
  true //是否显示关闭图标
);
  你可以给BoxPage加上出现和消失时特效现有支持特效有淡入、缩放以及无特效当然从设计上可以非常轻松地对其进行扩展

box.Effect = Effect.Fade(box);  BoxPage拥有ShowComplete和CloseComplete事件你可以通过注册这些事件来做些操作

box.ShowComplete EventHandler(Box_ShowComplete);
box.CloseComplete EventHandler(Box_CloseComplete);
  最后Show思路方法弹出窗口当然也可以ShowAsModal思路方法来弹出个模式窗口所谓模式窗口就是在弹出后会遮住下面所有Control控件

box.Show;
box.ShowAsModal;
  如果你觉得这样使用还算简单那么我想我已经成功了当然我们还有另个Control控件你可以通过PopupServiceGetMessagePage思路方法来获取个消息对话框这是个只用来显示消息不可以自定义Control控件作为内容简单对话框在此放上两张图先展示下效果

  在展示以前我还是想再 3声明美工不是般地差因此对话框样式极为难看请给我时间去改进样式谢谢……

Silverlight<img src='/icons/49561de.gif' />弹出窗口--展示

  左边是弹出窗口右边是消息窗口

  这个版本相比上个版本改进   当然上个版本大家是没有见过也永远不会见到但作为对自己负责我还是记录下这个版本改进并且在此的间应当也能略窥此弹出窗口功能

  1.解决多个弹出窗口时遮罩层重复问题现在多个弹出窗口将共用个遮罩层

  2.解决多个弹出窗口中有个窗口为模式对话框情况下关闭此模式对话框将不会取消模式遮罩层问题

  3.解决多个弹出窗口情况下点击后台窗口将其置于最上层问题

  后续版本将要出现改进   也许是下个版本也许是下n个版本但是这些改进已经列入了计划总有天他们会得到实现

  1.多国语言化主要是按钮文字

  2.提供更多样式自定义功能

  3.优化PopupService存储将已经无用PopupService(即不再管理任何弹出窗)及时从缓存Cache中清除

  4.BoxPage加上Border

  5.当前窗口弹出均在遮罩层中间改进为可以指定窗口弹出时相对遮罩层位置

  6.如果弹出窗口位置已经有其他窗口将窗口进行定量偏移以保证不会完全挡住原有窗口

  7.弹出窗口在拖动时候可以移出其遮罩层范围最好可以控制遮罩层大小且不允许弹出窗口随意移动这样可以将弹出窗口可移动范围控制在个区域的内

  已知Bug   当然我只是只菜鸟出来东西必定有着问题在此是至今发现问题也希望大家多多提供Bug



  1.当在BoxPage中加载图片时使用相对路径将造成读取类库相对路径图片产生图片读取不知如何才能设置为去读取当前运行项目相对路径

  2.MessagePage和BoxPage中依旧存在部分相似、相同代码无法完全抽象分离需要考虑优化设计

  3.MessagePage中内容为定数量并且没有空格英文串时会产生最后换行问题

  4.使用渐隐特效时窗口消失有时间所以可以多次点击MessagePage上区别按钮但结果以最后次点击按钮为准应当修正为后续按钮点击都无效

  5.无数未知问题和BUG……

  设计及实现介绍   写到这里时候我突然发现自己有点累了虽然这是最重要内容但是老妈难得来上海看我现在正在旁边实在没有什么心情继续因此请允许我将这“精彩”重头戏留到下

  源码分享   以下是本作品源码地址对于没有Silverlight开发环境同学就不要指望去打开项目了但是SilverlightApplication1debugbinTestPage.htm依旧是可以运行相信你已经安装了Silverlight Runtime当然没有安装你也会被微软要求安装~~

  这里是展示页面个截图

Silverlight<img src='/icons/49561de.gif' />弹出窗口--展示

  再次声明美工非常差因此界面非常简单我想点下按钮这事大家都会用所以我就不对这个界面多作解释了



Tags:  silverlight2 silverlight是什么 silverlight.2.0 silverlight

延伸阅读

最新评论

发表评论