zoukankan      html  css  js  c++  java
  • 稳扎稳打Silverlight(41) 3.0Tip/Trick之GPU 加速, OutOfBrowser, 应用程序库缓存, 合并 ResourceDictionary, 应用程序扩展服务, Silverlight 插件对象

    [索引页]
    [源码下载]


    稳扎稳打Silverlight(41) - 3.0Tip/Trick之GPU 加速, Out-Of-Browser, 应用程序库缓存, 合并 ResourceDictionary, 应用程序扩展服务, Silverlight 插件对象


    作者:webabcd


    介绍
    Silverlight 3.0 提示和技巧系列
    • GPU 加速 - 对 GPU 加速的支持
    • Out-Of-Browser -  浏览器外运行,即支持脱离浏览器运行
    • 应用程序库缓存 - 将 dll(zip) 缓存到客户端浏览器中 
    • 合并 ResourceDictionary - 整合不同位置的 ResourceDictionary 
    • 应用程序扩展服务 - 通过扩展 Application 来提供附加服务
    • Silverlight 插件对象的新增功能 - 在 Silverlight 3.0 中 Silverlight 插件对象的新增功能


    在线DEMO
    http://www.cnblogs.com/webabcd/archive/2009/08/04/1538238.html


    示例
    1、如何实现 GPU 加速
    GPU.xaml
    <navigation:Page x:Class="Silverlight30.Tip.GPU" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="GPU Page">
        
    <Grid x:Name="LayoutRoot">

            
    <Grid.Resources>
                
    <Storyboard x:Name="ani" AutoReverse="True" RepeatBehavior="Forever">
                    
    <DoubleAnimation Storyboard.TargetName="st" Storyboard.TargetProperty="ScaleX"
                        From
    ="1" To="3" Duration="0:0:3" />
                    
    <DoubleAnimation Storyboard.TargetName="st" Storyboard.TargetProperty="ScaleY"
                        From
    ="1" To="3" Duration="0:0:3" />
                    
    <DoubleAnimation Storyboard.TargetName="rt" Storyboard.TargetProperty="Angle"
                        From
    ="0" To="360" Duration="0:0:3" />
                    
    <DoubleAnimation Storyboard.TargetName="mediaElement" Storyboard.TargetProperty="Opacity"
                        From
    ="1" To="0.3" Duration="0:0:3" />
                
    </Storyboard>
            
    </Grid.Resources>

            
    <MediaElement x:Name="mediaElement" Source="/Resource/Demo.mp4" Width="320" Height="240"
                AutoPlay
    ="True" MediaEnded="mediaElement_MediaEnded" RenderTransformOrigin="0.5,0.5">
                
    <MediaElement.RenderTransform>
                    
    <TransformGroup>
                        
    <ScaleTransform x:Name="st" ScaleX="1" ScaleY="1" />
                        
    <RotateTransform x:Name="rt" Angle="0" />
                    
    </TransformGroup>
                
    </MediaElement.RenderTransform>
                
                
    <!--
                    CacheMode - 缓存类型,用于 GPU 加速,当前只支持 BitmapCache(用 CPU 呈现 UIElement 一次,其结果位图会被缓存到 GPU, 然后通过 GPU 处理)
                        可被 GPU 加速的有: Scale, Rotate, Opacity, 矩形的Clip
                    CacheMode.RenderAtScale - 位图缓存相对于当前呈现的 UIElement 的放大倍数。由于需要缓存为位图,而对于 Silverlight 的矢量图形来讲,则可以设置此属性以尽可能避免失真(当然,此值设置得越高,GPU 的负担也会越重)
                
    -->
                
    <MediaElement.CacheMode>
                    
    <BitmapCache RenderAtScale="1" />
                
    </MediaElement.CacheMode>
            
    </MediaElement>
            
            
    <Image Source="/Resource/Logo.jpg" Width="160" Height="120" />

        
    </Grid>
    </navigation:Page>

    GPU.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight30.Tip
    {
        
    public partial class GPU : Page
        
    {
            
    public GPU()
            
    {
                InitializeComponent();

                
    this.Loaded += new RoutedEventHandler(GPU_Loaded);
            }


            
    void GPU_Loaded(object sender, RoutedEventArgs e)
            
    {
                ani.Begin();
            }


            
    private void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
            
    {
                
    // 重播
                mediaElement.Stop();
                mediaElement.Play();
            }

        }

    }


    GPUTestPage.html(宿主页)
        <div id="silverlightControlHost">
            
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
                width
    ="100%" height="100%">
                
    <param name="source" value="ClientBin/Silverlight30.xap" />
                
    <param name="onError" value="onSilverlightError" />
                
    <param name="background" value="white" />
                
    <param name="minRuntimeVersion" value="3.0.40624.0" />
                
    <param name="autoUpgrade" value="true" />
                
    <!--enableGPUAcceleration - 是否启用 GPU 加速-->
                
    <param name="enableGPUAcceleration" value="true" />
                
    <!--enableCacheVisualization - 是否将缓存区域可视化-->
                
    <!--
                  如果该属性为 true 则:
                      本身的颜色代表被缓存的对象
                      红色代表未被缓存的对象
                      绿色代表被自动缓存的对象。如果某对象在被缓存对象的上面,那么该对象会被自动缓存
              
    -->
                
    <param name="enableCacheVisualization" value="true" />
                
    <!--enableFramerateCounter - 是否显示帧率的相关信息-->
                
    <!--
                  显示的信息在 Silverlight 程序的左上角以黑底白字做显示:
                      第一个参数:帧率(FPS)
                      第二个参数:GPU 的内存的使用情况。单位:KB
              
    -->
                
    <param name="enableFramerateCounter" value="true" />
                
    <href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration: none">
                    
    <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight"
                        style
    ="border-style: none" />
                
    </a>
            
    </object>
            
    <iframe id="_sl_historyFrame" style="visibility: hidden; height: 0px;  0px;
                border: 0px"
    ></iframe>
        
    </div>


    2、Out-Of-Browser(对浏览器外运行的支持)
    OutOfBrowser.xaml
    <navigation:Page x:Class="Silverlight30.Tip.OutOfBrowser" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="OutOfBrowser Page">
        
    <Grid x:Name="LayoutRoot">

            
    <!--安装/卸载按钮-->    
            
    <Button x:Name="button" Click="button_Click" Width="100" Height="30" />
            
        
    </Grid>
    </navigation:Page>

    OutOfBrowser.xaml.cs
    /*
     * Application.InstallStateChanged - 浏览器外运行的相关状态发生改变时所触发的事件
     * Application.InstallState - 浏览器外运行的相关状态 [System.Windows.InstallState 枚举]
     *     NotInstalled - 在浏览器中运行
     *     Installing - 安装到桌面中
     *     Installed - 在浏览器外运行
     *     InstallFailed - 安装到桌面的过程中发生错误
     * Application.IsRunningOutOfBrowser - 当前程序是否是从浏览器外启动的
     * Application.Install() - 安装 Silverlight 程序到浏览器外(卸载只能通过右键菜单的方式卸载)
     * Application.CheckAndDownloadUpdateAsync, Application.CheckAndDownloadUpdateCompleted - 一对异步方法/事件,用于更新浏览器外运行的 Silverlight 程序(从服务器上下载新的版本)
     * 
     * 注:在 Silverlight 项目上单击右键 -> 属性 -> Out-of-Browser Settings 可以对“浏览器外运行”的相关参数做设置(也可以手动修改 Properties/OutOfBrowserSettings.xml)
     
    */


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight30.Tip
    {
        
    public partial class OutOfBrowser : Page
        
    {
            
    public OutOfBrowser()
            
    {
                InitializeComponent();
                
                
    this.Loaded += new RoutedEventHandler(OutOfBrowser_Loaded);
            }


            
    void OutOfBrowser_Loaded(object sender, RoutedEventArgs e)
            
    {
                InitButton();

                App.Current.InstallStateChanged 
    += new EventHandler(Current_InstallStateChanged);
            }


            
    void Current_InstallStateChanged(object sender, EventArgs e)
            
    {
                InitButton();
            }


            
    private void InitButton()
            
    {
                
    if (App.Current.IsRunningOutOfBrowser)
                
    {
                    button.Content 
    = "卸载";
                }

                
    else
                
    {
                    button.Content 
    = "安装";
                }

            }


            
    private void button_Click(object sender, RoutedEventArgs e)
            
    {
                
    if (!App.Current.IsRunningOutOfBrowser && App.Current.InstallState == InstallState.NotInstalled)
                
    {
                    App.Current.Install();
                }

                
    else
                
    {
                    MessageBox.Show(
    "请右键卸载");
                }

            }

        }

    }



    3、应用程序库缓存的说明
    ApplicationLibraryCaching.xaml
    <navigation:Page x:Class="Silverlight30.Tip.ApplicationLibraryCaching" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="ApplicationLibraryCaching Page">
        
    <Grid x:Name="LayoutRoot">

            
    <TextBlock>
                
    <Run>
                    应用程序缓存 - 将 dll 缓存到客户端浏览器中
                
    </Run>
                
    <LineBreak />
                
    <LineBreak />
                
    <Run>
                    启用“应用程序缓存” - 在 Silverlight 项目上单击右键 -> 属性 -> 勾选“ Reduce XAP size by using application library caching”复选框
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    “应用程序缓存”不能和“脱离浏览器支持”共同使用
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    启用应用程序缓存后,可被缓存的 dll 的属性 Copy Local 会被设置为 true
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    启用应用程序缓存后,所有可被缓存的 dll 会单独生成一个 zip 包
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    AppManifest.xml 会增加相应的 ExternalParts。例: 
    &lt;Deployment.ExternalParts&gt;&lt;ExtensionPart Source=&quot;System.Xml.Linq.zip&quot; /&gt;&lt;/Deployment.ExternalParts&gt;
                
    </Run>
            
    </TextBlock>
        
    </Grid>
    </navigation:Page>


    4、合并 ResourceDictionary 的演示
    App.xaml(在此处合并不同位置的 ResourceDictionary)
    <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
                 x:Class
    ="Silverlight30.App"
    >
        
    <Application.Resources>

            
    <!--
                以 xaml 方式整合外部 ResourceDictionary
            
    -->
            
    <ResourceDictionary>
                
    <ResourceDictionary.MergedDictionaries>
                    
    <ResourceDictionary Source="Style/ButtonStyle1.xaml" />
                    
    <ResourceDictionary Source="Style/ButtonStyle2.xaml" />
                
    </ResourceDictionary.MergedDictionaries>
            
    </ResourceDictionary>
            
            
    <!--
                以 cs 方式整合外部 ResourceDictionary
                ResourceDictionary dict = System.Windows.Markup.XamlReader.Load(xaml) as ResourceDictionary; 
                Resources.MergedDictionaries.Add(dict);
            
    -->
            
        
    </Application.Resources>
        
    </Application>


    5、应用程序扩展服务的 Demo
    App.xaml(注册服务)
    <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
                 x:Class
    ="Silverlight30.App"
                 xmlns:svc
    ="clr-namespace:Silverlight30.Tip"
    >
        
        
    <!--
            以 xaml 方式注册扩展服务
        
    -->
        
    <Application.ApplicationLifetimeObjects>
            
    <svc:MyExtensionService />
        
    </Application.ApplicationLifetimeObjects>
        
        
    <!--
            以 cs 方式注册扩展服务(在 App 的构造函数中)
            ApplicationLifetimeObjects.Add(new Silverlight30.Tip.MyExtensionService());
        
    -->
        
    </Application>

    MyExtensionService.cs
    /*
     * 自定义扩展服务需要实现 IApplicationService 接口或 IApplicationLifetimeAware 接口
     * IApplicationService 接口需要实现 StartService() 方法(Application.Startup 事件之前调用)和 StopService() 方法(Application.Exit 事件之后调用)
     * IApplicationLifetimeAware 接口需要实现的方法有 Starting(), Started(), Exiting(), Exited() 其分别在 Application.Startup 事件的之前和之后调用,以及 Application.Exit 事件的之前和之后调用
     
    */


    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    namespace Silverlight30.Tip
    {
        
    public class MyExtensionService : IApplicationService
        
    {
            
    public static MyExtensionService Current getset; }
            
    public string ExtensionInfo getset; }
            
            
    public void StartService(ApplicationServiceContext context)
            
    {
                Current 
    = this;
                ExtensionInfo 
    = "abc xyz";
            }


            
    public void StopService()
            
    {
                
            }

        }

    }


    ApplicationExtensionServices.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight30.Tip
    {
        
    public partial class ApplicationExtensionServices : Page
        
    {
            
    public ApplicationExtensionServices()
            
    {
                InitializeComponent();

                
    this.Loaded += new RoutedEventHandler(ApplicationExtensionServices_Loaded);
            }


            
    void ApplicationExtensionServices_Loaded(object sender, RoutedEventArgs e)
            
    {
                
    // 调用自定义的扩展服务
                MessageBox.Show(MyExtensionService.Current.ExtensionInfo);
            }

        }

    }



    6、Silverlight 插件对象的新增功能的简要说明
    Plugin.xaml
    <navigation:Page x:Class="Silverlight30.Tip.Plugin" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               mc:Ignorable
    ="d"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               d:DesignWidth
    ="640" d:DesignHeight="480"
               Title
    ="Plugin Page">
        
    <Grid x:Name="LayoutRoot">

            
    <TextBlock>
                
    <Run>
                    AllowHtmlPopupWindow - 是否允许使用 HtmlPage.PopupWindow 弹出新窗口
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    EnabledAutoZoom - 是否自动调整大小以适应浏览器的缩放
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    EnabledNavigation - 是否可以使用 HyperlinkButton 导航到外部链接
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    Application.Current.Host.Settings, Application.Current.Host.Content - 可对插件的一些属性和一些事件做设置
                
    </Run>
                
    <LineBreak />
                
    <Run>
                    EnableGPUAcceleration, EnableCacheVisualization, EnableFramerateCounter - 参见 GPUTestPage.html 中的说明
                
    </Run>
            
    </TextBlock>

        
    </Grid>
    </navigation:Page>


    OK
    [源码下载]
  • 相关阅读:
    字符串属于对象而非基本数据类型,为什么?
    比较字符串内容用equals,比较字符串的地址用==,为什么?
    服务器数据恢复方法,磁盘阵列崩溃怎么恢复数据
    服务器磁盘阵列数据恢复,raid5两块硬盘掉线数据恢复方法
    服务器存储共享文件夹丢失数据恢复检测报告
    SUN平台服务器光纤共享存储互斥失败如何恢复数据?
    服务器磁盘阵列存储瘫痪数据恢复成功案例
    EMC CX4-480服务器raid磁盘数据恢复案例
    服务器数据恢复方法_存储raid硬盘离线数据恢复案例
    山西某公司NetApp存储不小心删除文件数据恢复成功案例
  • 原文地址:https://www.cnblogs.com/webabcd/p/1562249.html
Copyright © 2011-2022 走看看