您的位置:首页 > 其它

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

2011-04-20 16:59 441 查看
前面两篇分别介绍Silverlight5Beta中XAML数据绑定支持的断点调试和鼠标的多重点击实现.本篇将解析Silverlight5Beta版本中对OOB模式下多窗口的支持.

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

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

Silverlight4OOB:

[1]修改Windows窗体样式

[2]访问剪贴板

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

[4]通过WebBrowser显示Html内容

[5]NotificationWindow(toast)

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

[7]调用com组件

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



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



授予OOB模式下访问权限:



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



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

privatevoidCreateWindows_BT_Click(objectsender,RoutedEventArgse)


[code]{

//CreateandOpenNewWindows


if(Application.Current.IsRunningOutOfBrowser)


{


WindowCreatenewWindows=newWindow();


CreatenewWindows.Width=400;


CreatenewWindows.Height=400;


CreatenewWindows.Title="ThisWindowComeFromNativeButton!";


CreatenewWindows.Content=newOperatorWindows.FirstChildWindow_From();


CreatenewWindows.Visibility=Visibility.Visible;//DisplayWindowsProperty


}


else


MessageBox.Show("PleaseRunApplicationtoOOBModel!","Tip",MessageBoxButton.OK);


}

[/code]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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



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



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

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


SilverlightOOBWindowsSTate:

WindowState.Minimized-[MIX]


WindowState.Maximized-[MAX]


WindowState.Normal-[Default]



.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

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



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


SilverlightOOBWindows非工作区:

[1]边框

[2]标题栏

[3]图标

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

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



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


SilverlightOOBWindows工作区:

[1]显示窗体

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

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

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



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


SilverlightOOBWindowStyle:

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

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

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



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



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

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


SilverlightCustomerChormeUIElement:

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

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

[3]LeftResize,RightResize,BottomResize:窗体四周的边框,用户用来单击并拖拽调整窗体大小

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



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



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

publicpartialclassWindowsChrome_Form:UserControl


[code]{

publicWindowsChrome_Form()


{


InitializeComponent();


}




publicWindowparentWindow;


publicWindowParentWindow


{


get{returnthis.parentWindow;}


set


{


this.parentWindow=value;


RealseUpWindow();


}


}


privatevoidCloseButton_Click(objectsender,RoutedEventArgse)


{


if(this.parentWindow!=null)


this.parentWindow.Close();//CloseWindows


}




publicvoidRealseUpWindow()


{


if(this.parentWindow!=null)


{


//RegisterWindowsEventHandler


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();


};


}


}


}

[/code]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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


privateFrameworkElementBuildWindowContents(Windowwindow)


[code]{

Gridgrid=newGrid();


OperatorWindows.WindowsChrome_Formchrome=newOperatorWindows.WindowsChrome_Form();


chrome.ParentWindow=window;//SetParentWindows


grid.Children.Add(newOperatorWindows.FirstChildWindow_From());


grid.Children.Add(chrome);




returngrid;


}

[/code]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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


privatevoidCreateWindows_BT_Click(objectsender,RoutedEventArgse)


[code]{

//CreateandOpenNewWindows


if(Application.Current.IsRunningOutOfBrowser)


{


WindowCreatenewWindows=newWindow();


CreatenewWindows.Width=500;


CreatenewWindows.Height=500;


CreatenewWindows.Title="ThisWindowComeFromNativeButton!";


CreatenewWindows.Content=BuildWindowContents(CreatenewWindows);//SetContent




CreatenewWindows.Visibility=Visibility.Visible;//DisplayWindowsProperty


CreatenewWindows.WindowStyle=WindowStyle.None;




}


else


MessageBox.Show("PleaseRunApplicationtoOOBModel!","Tip",MessageBoxButton.OK);


}

[/code]

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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



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



Silverlight5BetaMultipleWindowSupportSourceCode:/Files/chenkai/FuturesMultipleWindows_Demo.rar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐