前面两篇分别介绍Silverlight 5 Beta中XAML数据绑定支持的断点调试和鼠标的多重点击实现. 本篇将解析Silverlight 5 Beta版本中对OOB模式下多窗口的支持.

谈到Silverlight 对多窗体的支持.先对比以前Silverlight 版本中基本上无法独立实现一个新的操作窗体.如果在当前应用程序打开一个新的操作窗体.一般通过使用支持弹出的Element对象实现 或是在主提窗体中派生ChildWindows Control方式.Silverlight 5 Beta中泽支持你创建类似WPF自己的独立新窗体.可以创建依赖宿主窗体形式的新窗体.

先来回顾一下Silverlight 4版本中OOB[Out-Of-Browser]提升权限模式下能做什么:

Silverlight 4 OOB:

[1]修改Windows窗体样式

[2]访问剪贴板

[3]访问用户文件夹(沙箱)

[4]通过WebBrowser显示Html内容

[5]Notification Window(toast)

[6]宽松的跨域访问机制

[7]调用com组件

我们可以看到其中提到Silverlight 4 OOB模式下支持创建新的操作Notification Window 而不支持创建独立Window.如下演示Silverlight 5 Beta版本中创建整个新窗体Windows 过程.建立一个Silverlight Application.Solution组织结构:

设置为OOB模式并授予访问权限:

授予OOB模式下访问权限:

创建一个View界面点击Button时创建一个新的Window操作窗体:

Button后台时间创建一个Windows 窗体:

  1. private void CreateWindows_BT_Click(object sender, RoutedEventArgs e)
  2. {
  3. //Create and Open New Windows
  4. if (Application.Current.IsRunningOutOfBrowser)
  5. {
  6. Window CreatenewWindows = new Window();
  7. CreatenewWindows.Width = 400;
  8. CreatenewWindows.Height = 400;
  9. CreatenewWindows.Title = "This Window Come From Native Button!";
  10. CreatenewWindows.Content = new OperatorWindows.FirstChildWindow_From();
  11. CreatenewWindows.Visibility = Visibility.Visible;//Display Windows Property
  12. }
  13. else
  14. MessageBox.Show("Please Run Application to OOB Model!","Tip",MessageBoxButton.OK);
  15. }

设置新窗体的内容为新的操作页面FirstChildWindow_From.XAML定义随意的内容来标识新窗体如下:

运行起程序并打开多个窗体:

You See!成功创建多个Window. 当程序运行起来时操作上发现 当主窗体MainPage没有关闭时可以打开任意的多的新窗体. 关闭任意子窗体对对其他窗体不产生任何影响.但一旦关闭MainPage主窗体其他子窗体也随之关闭.可见Silverlight 5 Beta版本中针对OOB模式下子窗体创建时依赖在宿主窗体之上的.

在创建窗体通过设置Windows类的Visibility属性设置窗体是否可见. 当时在官方Blog有人提出这样API设计为何不修改成类似WinFrom中窗体的Show()方法来进行替代.其实这个属性在创建Windows不是必须需要设置的.WPF中队窗体显示采用也是Show()方法实现.说道性能.当然你还可以在Windows窗体加载生命期可以设置WindowsState:

Silverlight OOB WindowsSTate:
WindowState.Minimized-[MIX]
WindowState.Maximized-[MAX]
WindowState.Normal-[Default]

窗口分为两个区域:非工作区和工作区.非工作区包含如下内容:

Silverlight OOB Windows非工作区:

[1]边框

[2]标题栏

[3]图标

[4]“最小化”、“最大化”和“还原”、“关闭”按钮

[5]“系统”菜单,其中包含允许用户最小化、最大化、还原、移动和关闭窗口以及调整窗口大小的菜单项

非工作区则是Windows窗体所有共有的属性.工作区的非工作区内部的区域,开发人员使用它来添加应用程序特定的内容,如菜单栏、工具栏和控件.工作区的所具有职责:

Silverlight OOB Windows工作区:

[1]显示窗体

[2]配置窗体的大小,位置和外观

[3]承载应用程序特定的内容

[4]管理应用程序的生命周期

同样类似WPF中Window操作,Silverlight OOB模式窗体同样支持窗体样式定义.从窗口的非工作区公开的边框适合大多数应用程序。 但是,在有些情况下,可能需要使用不同类型的边框,或根本不需要边框,这要取决于窗口的类型。若要控制窗口的边框的类型,请将窗口的 WindowStyle 属性设置为以下 WindowStyle 枚举值之一:

Silverlight OOB WindowStyle:

[1]SingleBorderWindow-窗口显示标题栏和边框

[2]None-窗口不显示标题栏或边框

[3]BorderlessRoundCornersWindow-窗口不显示标题栏或边框,且窗口角变圆

其中SingleBorderWindows作为默认值.默认显示标题和边框.当设置WindowsStyle=SingleBorderWindow窗体效果如下:

但经过测试WindowsStyle在呈现窗体样式并不稳定.另外使用BorderlessCornersWindow偶尔出现一次异常.有待进一步改善.ok,我们可以看到没有非工作区的窗体样式.当然在项目实际使用场景中通常需要需要额外自定义窗体样式.Silverlight 5 Beta对窗体样式支持自定义.

创建窗体的自定义样式不仅仅需要设置Window窗体本身属性,同样需要提供可以控制窗体大小和移动的元素.幸运的是,Silverlight 5 Beta中提供一些辅助方法来帮助避免编写所有拖/移动/调整窗体大小的代码.如果实现自定义窗体的非工作区样式.需要哪些额外的元素:

Silverlight Customer Chorme UI Element:

[1]Title Bar:用于点击或拖拽窗体Widnow.

[2]Close Button:顾名思义关闭窗体Window.

[3]Left Resize, Right Resize, Bottom Resize:窗体四周的边框,用户用来单击并拖拽调整窗体大小

[4]Left Bottom Resize, Right Bottom Resize:窗体地步左右两边正方形.这允许用户在两个方向上调整一次窗口,并有适当的对角线分配给他们调整的游标

ok.搞清楚我们需要什么我们自定义一下窗体的样式 添加一个新的WindowsChrome_Form.xaml 定义如下:

WindowsChrom_From的UserControl基本包含所有窗体共有的特性.拖拽 窗体大小控制.后台控制方法:

  1. public partial class WindowsChrome_Form : UserControl
  2. {
  3. public WindowsChrome_Form()
  4. {
  5. InitializeComponent();
  6. }
  7. public Window parentWindow;
  8. public Window ParentWindow
  9. {
  10. get { return this.parentWindow; }
  11. set
  12. {
  13. this.parentWindow = value;
  14. RealseUpWindow();
  15. }
  16. }
  17. private void CloseButton_Click(object sender, RoutedEventArgs e)
  18. {
  19. if (this.parentWindow != null)
  20. this.parentWindow.Close();//Close Windows
  21. }
  22. public void RealseUpWindow()
  23. {
  24. if (this.parentWindow != null)
  25. {
  26. //Register Windows Event Handler
  27. RightResize.MouseLeftButtonDown += (s, se) =>
  28. {
  29. this.parentWindow.DragResize(WindowResizeEdge.Right);
  30. };
  31. LeftResize.MouseLeftButtonDown += (s, ea) =>
  32. {
  33. this.parentWindow.DragResize(WindowResizeEdge.Left);
  34. };
  35. BottomResize.MouseLeftButtonDown += (s, ea) =>
  36. {
  37. this.parentWindow.DragResize(WindowResizeEdge.Bottom);
  38. };
  39. LeftBottomResize.MouseLeftButtonDown += (s, ea) =>
  40. {
  41. this.parentWindow.DragResize(WindowResizeEdge.BottomLeft);
  42. };
  43. RightBottomResize.MouseLeftButtonDown += (s, ea) =>
  44. {
  45. this.parentWindow.DragResize(WindowResizeEdge.BottomRight);
  46. };
  47. TitleBar.MouseLeftButtonDown += (s, ea) =>
  48. {
  49. this.parentWindow.DragMove();
  50. };
  51. }
  52. }
  53. }

定义好Windows窗体所具有外在窗体行为.我们在把自定义样式嵌入到新创建窗体上 在MainPage定义一个方法用来添加自定义样式绑定行为:

  1. private FrameworkElement BuildWindowContents(Window window)
  2. {
  3. Grid grid = new Grid();
  4. OperatorWindows.WindowsChrome_Form chrome = new OperatorWindows.WindowsChrome_Form();
  5. chrome.ParentWindow = window;//Set Parent Windows
  6. grid.Children.Add(new OperatorWindows.FirstChildWindow_From());
  7. grid.Children.Add(chrome);
  8. return grid;
  9. }

再来修改创建窗体设置Windows.Style=None[不显示标题和边框],同时设置新建窗体内容设置为自定义样式:

  1. private void CreateWindows_BT_Click(object sender, RoutedEventArgs e)
  2. {
  3. //Create and Open New Windows
  4. if (Application.Current.IsRunningOutOfBrowser)
  5. {
  6. Window CreatenewWindows = new Window();
  7. CreatenewWindows.Width = 500;
  8. CreatenewWindows.Height = 500;
  9. CreatenewWindows.Title = "This Window Come From Native Button!";
  10. CreatenewWindows.Content = BuildWindowContents(CreatenewWindows);//Set Content
  11. CreatenewWindows.Visibility = Visibility.Visible;//Display Windows Property
  12. CreatenewWindows.WindowStyle = WindowStyle.None;
  13. }
  14. else
  15. MessageBox.Show("Please Run Application to OOB Model!","Tip",MessageBoxButton.OK);
  16. }

在此运行看看用户自定义的窗体样式就新鲜出炉了:

You See!效果虽然有些粗糙则足以证明用户自定义样式可以实现的,作为Silverlight 5 Beta添加对窗体支持.最为关键的是同时在一个主窗体宿主上支持多个Windows窗体.

窗口可以有三种状态:正常、最小化和最大化。 处于正常状态的窗口是窗口的默认状态。 处于此状态的窗口如果是可调整大小的,则允许用户使用大小调整手柄或边框来移动窗口或调整窗口大小.

不知熟悉WPF看到Silverlight 5 Beta这个多窗体特性支持是否觉得和WPF中窗体支持有些类似.确实是.了解Silverlight OOB模式下Windows窗体的组成:

附件:http://down.51cto.com/data/2359667

本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/763602

Silverlight 5 Beta新特性[3]多窗口支持相关推荐

  1. Silverlight 5 Beta新特性博文索引

    在MIX11大会上相对Windows phone 7 令人瞩目期待本年一次重大更新Mango所带来的新特性以及Kinect for Windows SDK在现场大放异彩的Action演示.Silver ...

  2. 【转】Silverlight 3 Beta 新特性解析(7)- Child Window和Shader Effect篇

    前提条件: 阅读本文之前请确认你已经安装了如下软件 Visual Studio 2008 (Express) SP1 Silverlight 3 Tools For Visual Studio Mic ...

  3. Silverlight 5 Beta新特性[4]文本缩进控制

    持续带来Silverlight 5 Beta新特性的更新.在Silverlight 5 Beta版本对文本的处理能力做了真正的改进.其中从官方Silverlight 5 Beta Futurez中提到 ...

  4. Silverlight 5 Beta新特性[5]隐式模板支持

    继续更新Silverlight 5 Beta新特性.在Silverlight 5 BEta更新出来新特性中有一些是WPF已经存在的影子.类似前面提到的多窗体[Multiple Window Suppo ...

  5. Silverlight 5 Beta 新特性预览

    MIX11大会昨天刚刚结束.第二天核心Session包含三个部分:Windows phone 7/Silverlight 5 Beta/Kinect for Windows SDK.在整个全程直播中. ...

  6. Silverlight 5 beta新特性探索系列:9.视频快进快退和TextSearch对象对文字项查询

    本节讲诉两个新特性:一.在Silverlight 5中可以控制MediaElement对象播放的视频进行快进快退控制.二.在Silverlight 5中的文字项进行搜索查询. 一.对于MediaEle ...

  7. Silverlight 5 beta新特性探索系列:3.Silverlight5中的文字增进控制【附带实例源码】...

    在Silverlight 5中新增了CharacterSpacing属性对文字间距进行控制,增加了RichTextBoxOverflow控件以灵活的对大量文字进行合理的排版显示. 一.Characte ...

  8. chrome 63 android分类,Chrome 63 Beta新特性介绍

    原标题:Chrome 63 Beta新特性介绍 除非另外注明,否则,下面介绍的更改均适用于最新 Chrome Beta 渠道版(Android.Chrome 操作系统.Linux.Mac 和 Wind ...

  9. go每日新闻(2021-12-01)——Go 1.18新特性前瞻:原生支持Fuzzing测试

    每日一谚: Go's package system teach us to prioritize the consumer of our code. go中文网每日资讯–2021-12-01 一.Go ...

最新文章

  1. 万字长文:深度解读最新发布的《国家数据安全法》 by 傅一平
  2. 什么?强化学习竟然来源于心理学?
  3. 用ORBSLAM2运行TUM Dataset数据集Monocular Examples
  4. omnigraffle怎么画曲线
  5. 使用MEF构建可扩展的Silverlight应用
  6. WebApp 里Meta标签大全
  7. tcp前4字节消息长度_网络基础篇之TCP
  8. 图片列表页的显示方法
  9. ipad录屏软件_如何在 Mac 上优雅的截图和录屏
  10. wlan无线网络密码破解
  11. 【IPC】关于码流类型的理解
  12. 代沐研:渡尽劫波非农在,空头有望脱苦海
  13. 《神奇的数学》读后感_数学王国_奇妙的数学王国读后感10篇
  14. onlyoffice 收费不_OMG!你家小区物业有没有这些乱收费的现象……|物业|物业管理|物业服务|门禁卡|停车费...
  15. ipad发布会ipad_iPad诞生十周年
  16. js 操作在当前日期加减(天、周、月、年数)
  17. 性能测试工具kylinPET的国产化道路
  18. Linux中进程的退出
  19. ajax实验,AJAX实验报告.doc
  20. 用matlab画声波,基于MATLAB的声波分析研究-复旦大学物理教学试验中心.PDF

热门文章

  1. 7-200 天梯赛的善良 (20 分)
  2. 如何监测服务器网络稳定性centos,centos下网络监测工具nethogs
  3. 鸿蒙WLAN模组联网+解决在Visual Studio Code不能更改Linux文件的问题
  4. java dom获取命名空间属性_java – 如何在XML DOM对象中添加命名空间前缀?
  5. [Web]Restful风格的适用场景
  6. ES6入门——类的概念
  7. Atitit 硬件 软件 的开源工作 差异对比
  8. ANDROID调用webservice带soapheader验证
  9. 光棍节的快乐 NYOJ 451
  10. 【转载】socket select模型