Silverlight 5 Beta新特性[3]多窗口支持

Silverlight 5 Beta新特性[3]多窗口支持,第1张

概述前面两篇分别介绍Silverlight 5 Beta中XAML数据绑定支持的断点调试和鼠标的多重点击实现. 本篇将解析Silverlight 5 Beta版本中对OOB模式下多窗口的支持. 谈到Silverlight 对多窗体的支持.先对比以前Silverlight 版本中基本上无法独立实现一个新的 *** 作窗体.如果在当前应用程序打开一个新的 *** 作窗体.一般通过使用支持d出的Element对象实现 或是

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

谈到Silverlight 对多窗体的支持.先对比以前Silverlight 版本中基本上无法独立实现一个新的 *** 作窗体.如果在当前应用程序打开一个新的 *** 作窗体.一般通过使用支持d出的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 窗体:

  private voID Createwindows_BT_Click(object sender, RoutedEventArgs e)           {               //Create and Open New windows                if (Application.Current.IsRunningOutOfbrowser)               {                   Window Createnewwindows = new Window();                   Createnewwindows.WIDth = 400;                   Createnewwindows.Height = 400;                   Createnewwindows.Title = "This Window Come From Native button!";                  Createnewwindows.Content = new Operatorwindows.FirstChilDWindow_From();                  Createnewwindows.Visibility = Visibility.Visible;//display windows Property              }              else                MessageBox.Show("Please Run Application to OOB Model!","Tip",MessageBoxbutton.OK);           }   

设置新窗体的内容为新的 *** 作页面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基本包含所有窗体共有的特性.拖拽 窗体大小控制.后台控制方法:

  public partial class windowsChrome_Form : UserControl           {               public windowsChrome_Form()               {                   InitializeComponent();               }                       public Window parentwindow;               public Window Parentwindow              {                  get { return this.parentwindow; }                  set                  {                      this.parentwindow = value;                      RealseUpWindow();                  }              }              private voID Closebutton_Click(object sender, RoutedEventArgs e)              {                  if (this.parentwindow != null)                      this.parentwindow.Close();//Close windows              }                     public voID RealseUpWindow()              {                  if (this.parentwindow != null)                  {                      //Register windows Event Handler                      RightResize.MouseleftbuttonDown += (s, se) =>                       {                          this.parentwindow.DragResize(WindowResizeEdge.Right);                      };                      leftResize.MouseleftbuttonDown += (s, ea) =>                      {                          this.parentwindow.DragResize(WindowResizeEdge.left);                      };                             Bottomresize.MouseleftbuttonDown += (s, ea) =>                      {                          this.parentwindow.DragResize(WindowResizeEdge.Bottom);                      };                             leftBottomresize.MouseleftbuttonDown += (s, ea) =>                      {                          this.parentwindow.DragResize(WindowResizeEdge.Bottomleft);                      };                            RightBottomresize.MouseleftbuttonDown += (s, ea) =>                      {                          this.parentwindow.DragResize(WindowResizeEdge.Bottomright);                      };                           Titlebar.MouseleftbuttonDown += (s, ea) =>                      {                          this.parentwindow.DragMove();                      };                  }              }          }   

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

  private FrameworkElement BuilDWindowContents(Window window)                 {                     GrID grID = new GrID();                     Operatorwindows.windowsChrome_Form Chrome = new Operatorwindows.windowsChrome_Form();                     Chrome.Parentwindow = window;//Set Parent windows                     grID.Children.Add(new Operatorwindows.FirstChilDWindow_From());                     grID.Children.Add(Chrome);                               return grID;                 }   

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

  private voID Createwindows_BT_Click(object sender, RoutedEventArgs e)                {                    //Create and Open New windows                     if (Application.Current.IsRunningOutOfbrowser)                    {                        Window Createnewwindows = new Window();                        Createnewwindows.WIDth = 500;                        Createnewwindows.Height = 500;                        Createnewwindows.Title = "This Window Come From Native button!";                       Createnewwindows.Content = BuilDWindowContents(Createnewwindows);//Set Content                               Createnewwindows.Visibility = Visibility.Visible;//display windows Property                       Createnewwindows.windowstyle = windowstyle.None;                    }                   else                     MessageBox.Show("Please Run Application to OOB Model!",MessageBoxbutton.OK);               }   

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

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

 

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

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

总结

以上是内存溢出为你收集整理的Silverlight 5 Beta新特性[3]多窗口支持全部内容,希望文章能够帮你解决Silverlight 5 Beta新特性[3]多窗口支持所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1078052.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存