前提条件:

阅读本文之前请确认你已经安装了如下软件

  • Visual Studio 2008 (Express) SP1
  • Silverlight 3 Tools For Visual Studio
  • Microsoft Expression Blend 3 MIX 09 Preview
  • .Net RIA Service Preview

本篇主要内容:

  • Child Window
  • Shader Effect
  • Assembly Cache

Child Window:

Silverlight 3增加了两种新类型的空间

除了Silverlight 3 Beta 新特性解析(6) - Navigation和Deep Linking篇介绍的Page控件

还有就是本节将介绍的Child Window控件

(WPF也有这两种控件,现在都被Silverlight借用过来了。事实上大家可以通过自定义控件的方式来实现上述两种控件)

Page控件继承自UserControl

而Child Window控件继承自ContentControl,其属性和方法如下

调用Show显示子窗口,并使得App.Current.RootVisual不可点击,而点击关闭按钮

如下图,将去调用Close方法,关闭子窗口,并使得App.Current.RootVisual重新可以响应事件

在这个介绍中将使用Silverlight 3 Beta 新特性解析(6) - Navigation和Deep Linking篇中的范例

我们在Views目录下创建一个Child Window控件如下

下面我们将不在通过切换页面的形式来显示详细的联系信息内容,而是弹出个对话框,来显示结果

修改ContactWin.xaml如下:

<controls:ChildWindow x:Class="SL3Beta.Nav.Views.ContactWin"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
           xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm"
           Width="400" Height="300" 
           Title="ContactWin">
    <Grid x:Name="LayoutRoot" Margin="2">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        
        <dataControls:DataForm x:Name="ContactForm"></dataControls:DataForm>
 
        <Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
        <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />
    </Grid>
</controls:ChildWindow>

而ContactWin.xaml.cs为:

private PersonDomainContext _personContext = new PersonDomainContext();
 
public ContactWin(int contactID)
{
    InitializeComponent();
 
    _personContext.Loaded += (sender, e2) =>
    {
        if (_personContext.Contacts.Count > 0)
            this.ContactForm.CurrentItem = _personContext.Contacts[0];
    };
    _personContext.LoadContactByContactID(contactID);
}

修改EmployeePage.xaml.cs代码如下:

private void ViewContactButton_Click(object sender, RoutedEventArgs e)
{
    Employee employee = this.EmployeeGrid.SelectedItem as Employee;
    if (employee != null)
    {
        ContactWin contactWin = new ContactWin(employee.ContactID);
 
        contactWin.Show();
        //this.NavigationService.Navigate(new Uri(String.Format("ContactID={0}", employee.ContactID), UriKind.Relative));
    }
}

启动工程后得到如下的效果图:

没弹出对话框之前

弹出对话框之后

有人可能觉得上述界面不够美观,比如关闭按钮

没关系,由于ChildWindow继承自ContentControl

意味着我们可能修改其Template或者Style

用Blend 3打开工程,并打开ContactWin.xaml文件,并按下图选择Edit a Copy…来重新定义其Style

选择一个新的Style的名字并按确定后,我们就见到默认的ChildWindow的样式了(查看其他控件的默认样式也是这样的)

现在你就可以修改CloseButton等的样式或者模板来获得更好用户界面了

此外有人可能想要添加好的表现特效来获得更好的用户体验

比如,弹出ChildWindow后,背景模糊化或者扭曲化

这就需要借助Shader Effect的帮助了

Shader Effect:

Shader Effect叫做像素处理技术

如果刨根究底的话,这是一门科学,叫做数字图像处理

在这里就不介绍如何对图像进行处理了,因为那是门需要几百页篇幅的书籍才能讲得完的学问

先来看些实际效果吧

目前微软内置提供的只有两个像素特效效果,分别为BlurEffect和DropdownEffect

这两种特效的使用已经在Silverlight 3 Beta 新特性解析(2)-Graphics篇做了介绍

多亏了新的Bitmap API,使得我们可以操纵每个像素,因此我们也可能制作自己的特效

但是相信很多人都非常头疼去自己定义特效效果

而且这也非常不可能,毕竟很多人都没有学过数字图像处理的知识

幸好国外有人提供了拥有诸多特效的特效包ShaderEffectLibrary

其包含了22种全新的特效,如下

  • BandedSwirlEffect
  • BloomEffect
  • BrightExtractEffect
  • ColorKeyAlphaEffect
  • ColorToneEffect
  • ContrastAdjustEffect
  • DirectionalBlurEffect
  • EmbossedEffect
  • GloomEffect
  • GrowablePoissonDiskEffect
  • InvertColorEffect
  • LightStreakEffect
  • MagnifyEffect
  • MonochromeEffect
  • PinchEffect
  • PixelateEffect
  • RippleEffect
  • SharpenEffect
  • SmoothMagnifyEffect
  • ToneMappingEffect
  • ToonShaderEffect
  • ZoomBlurEffect

下面我们将ShaderEffectLibrary导入Silverlight工程

修改EmployeePage.xaml.cs的ViewContactButton_Click事件如下

   1: private void ViewContactButton_Click(object sender, RoutedEventArgs e)
   2: {
   3:     Employee employee = this.EmployeeGrid.SelectedItem as Employee;
   4:     if (employee != null)
   5:     {
   6:         ContactWin contactWin = new ContactWin(employee.ContactID);
   7:         RippleEffect rippleEff = new RippleEffect();
   8:         rippleEff.Amplitude = 1;
   9:         rippleEff.Frequency = 1;
  10:         App.Current.RootVisual.Effect = rippleEff;
  11:  
  12:         contactWin.Closed += (sender2, e2) =>
  13:             {
  14:                 App.Current.RootVisual.Effect = null;
  15:             };
  16:  
  17:         contactWin.Show();
  18:         //this.NavigationService.Navigate(new Uri(String.Format("ContactID={0}", employee.ContactID), UriKind.Relative));
  19:     }
  20: }

由于所有继承自UIElement的控件都有Effect这个属性

所以我们可以给App.Current.RootVisual设置特效(这里设置的是RippleEffect)

而12~15将在ChildWindow关闭后,让App.Current.RootVisual恢复原状

其他的个别几种特效效果例举如下:

BandedSwirlEffect

ZoomBlurEffect

Assembly Cache:

由于Silverlight是网络应用

所以对下载的包的大小非常敏感

毕竟用户都是比较没有耐心的,如果让他们等待载入一个网站需要2分钟

可能他们就干脆关闭浏览器了

所以微软在Silverlight 3引进了Assembly Cache来缩小xap的大小

使得项目支持Assembly Cache的方式如下:

勾选Reduce Xap Size by caching framework extension assemblies(默认是不勾选的)

如下是我们已经生成的xap文件

在没有勾选和勾选了Reduce Xap Size by caching framework extension assemblies的xap大小如下

不支持Assembly Cache

支持Assembly Cache

可以看出,通过Assembly Cache技术,.xap的大小急剧下降,为了查看原因

更改.xap包的扩展名为.zip,并解压

我们可以看到不支持Assembly Cache的情况下

而支持Assembly Cache的情况下

我们再AppManifest.xaml文件的定义如下

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="SL3Beta.Nav" EntryPointType="SL3Beta.Nav.App" RuntimeVersion="3.0.40307.0">
  <Deployment.Parts>
    <AssemblyPart x:Name="SL3Beta.Nav" Source="SL3Beta.Nav.dll" />
    <AssemblyPart x:Name="ShaderEffectLibrary" Source="ShaderEffectLibrary.dll" />
    <AssemblyPart x:Name="System.ComponentModel.DataAnnotations" Source="System.ComponentModel.DataAnnotations.dll" />
    <AssemblyPart x:Name="System.ComponentModel" Source="System.ComponentModel.dll" />
    <AssemblyPart x:Name="System.Windows.Controls.Data.DataForm" Source="System.Windows.Controls.Data.DataForm.dll" />
    <AssemblyPart x:Name="System.Windows.Controls.Data" Source="System.Windows.Controls.Data.dll" />
    <AssemblyPart x:Name="System.Windows.Controls" Source="System.Windows.Controls.dll" />
    <AssemblyPart x:Name="System.Windows.Controls.Navigation" Source="System.Windows.Controls.Navigation.dll" />
    <AssemblyPart x:Name="System.Windows.Ria.Controls" Source="System.Windows.Ria.Controls.dll" />
    <AssemblyPart x:Name="System.Windows.Ria" Source="System.Windows.Ria.dll" />
  </Deployment.Parts>
</Deployment>

不支持Assembly Cache

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="SL3Beta.Nav" EntryPointType="SL3Beta.Nav.App" RuntimeVersion="3.0.40307.0">
  <Deployment.Parts>
    <AssemblyPart x:Name="SL3Beta.Nav" Source="SL3Beta.Nav.dll" />
    <AssemblyPart x:Name="ShaderEffectLibrary" Source="ShaderEffectLibrary.dll" />
    <AssemblyPart x:Name="System.Windows.Ria.Controls" Source="System.Windows.Ria.Controls.dll" />
    <AssemblyPart x:Name="System.Windows.Ria" Source="System.Windows.Ria.dll" />
  </Deployment.Parts>
  <Deployment.ExternalParts>
    <ExtensionPart Source="http://go.microsoft.com/fwlink/?LinkID=142565" />
    <ExtensionPart Source="http://go.microsoft.com/fwlink/?LinkID=141727" />
    <ExtensionPart Source="http://go.microsoft.com/fwlink/?LinkID=142573" />
    <ExtensionPart Source="http://go.microsoft.com/fwlink/?LinkID=142572" />
    <ExtensionPart Source="http://go.microsoft.com/fwlink/?LinkID=142571" />
    <ExtensionPart Source="http://go.microsoft.com/fwlink/?LinkID=142575" />
  </Deployment.ExternalParts>
</Deployment>

支持Assembly Cache

原来微软通过不将Silverlight 3原生支持的dll放置进去.xap包中来降低下载包的大小

而原生支持的dll包将通过网络来获取,而其只在第一访问Silverlight应用程序的时候才下载并缓存在用户的硬盘上

下次将直接从缓存中读取,从而节省了带宽,也减少了下载包的大小,一举两得

结束语:

到这里,我想将讲述的Silverlight 3 Beta的新特性也终于要告一个段落了

下面一阶段就是用Silverlight 3 Beta构建几个小的Demo

大家可以回复给出自己希望看到的Demo,我将酌情实现下

比如:

图片幻灯片

视频播放器

网络即时聊天工具

等等

作者:ibillguo
出处:http://ibillguo.cnblogs.com/
本文版权由作者和博客园共同所有,转载请注明出

转载于:https://www.cnblogs.com/SissyNong/archive/2009/08/04/1538233.html

【转】Silverlight 3 Beta 新特性解析(7)- Child Window和Shader Effect篇相关推荐

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

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

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

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

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

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

  4. Silverlight 5 Beta 新特性预览

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

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

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

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

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

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

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

  8. python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里

    Python3.8正式发布!新特性解析在这里 诗书塞外 Python程序员 10月14日,Python 3.8 正式版发布.这也意味着一个Python开发周期的结束,和另一个开发周期的开始.Pytho ...

  9. JavaScript ES2021 新特性解析

    JavaScript ES2021 新特性解析 新特性列表 String.prototype.replaceAll Promise.any 逻辑运算符和赋值表达式 数值分隔符 Intl.ListFor ...

最新文章

  1. [译] 数据可视化教程:基于Google Sheets 和 RStudio Shiny 建立实时仪表盘
  2. 最新综述 | 基于深度学习的立体视觉深度估计
  3. android:configChanges=keyboard|keyboardHidden|orientation|screenSize
  4. EFM32外设模块—USART V1.00
  5. 炸!亿级数据DB秒级平滑扩容!!!
  6. 定时发布任务,在global.asax中获取文件的物理路径的方法
  7. C++字符串之一(字符表示)
  8. Android之判断网络状态(网络的连接,改变,和判断2G/3G/4G)
  9. redis分片_Redis分片
  10. Atitit  从 RGB 到 HSL 或 HSV 的转换
  11. 2019 Web 前端热点笔试面试题总结(转载)
  12. 语义分割学习总结(一)—— 基本概念篇
  13. IBM Websphere MQ 基础3:Listener监听器
  14. 计算机不认2t移动硬盘,高手指导win7系统无法识别2T希捷的硬盘的还原技巧
  15. 高德地图安卓 拖拽选点_不止微信支付宝 高德地图正式上线小程序入口
  16. 极坐标梯度公式_一种基于极坐标系梯度变化的类圆环边缘检测方法与流程
  17. 【ZZULIOJ】1070: 小汽车的位置
  18. 本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了
  19. Linux常用库函数
  20. Collection 接口

热门文章

  1. mysql replace报错_Mysql中replace与replace into的用法讲解
  2. java能应聘哪些职位_应聘java专员职位的面试题
  3. c++语言中如何写入文件,C++:在多线程程序中写入文件
  4. java 柱状图下载_(JFreeChart)Java图表制作
  5. 函数字节不对齐函数崩溃_Excel中统计字符数,不需要一个一个的数,len函数能轻松搞定...
  6. 分享一个高质量的 小程序UI框架
  7. Mac设置信认任意来源应用
  8. win7下命令行提示符从C盘进入E盘的文件夹下
  9. OTL调用Oracle存储过程
  10. 用户界面设计风格说明