简单探照灯遮照效果的Silverlight程序

   最近做SonySource项目时实现了几个很小的Silverlight程序,分别是Clock、HomePeoplePicker和ManageMentPeoplePicker。实际上这三个silverlight程序都非常简单,主要特点有以下几个方面:

  1. Silverlight程序和页面上的HTML元素混合在一起,且在特定事件触发后要动态改变Silverlight程序在页面中占的位置及大小,但给用户的感觉是无缝连接;
  2. Javascript和Silverlight相互调用;
  3. 简单的探照灯遮照效果;

下面就分别对我认为比较不好处理的地方或者一些我费了很多周折才实现的地方做一简要说明:

  一、使Silverlight浮动在Html元素中,并动态改变大小

  或许我这个小标题描述得还不是很准确,不能直观表达我的意思。举个例子,假设我们要用Silverlight做个下拉菜单,并将他放在html页面上使用。我们希望这个silverlight菜单所占的大小只是980px宽和30px高,因为在紧挨菜单的上面和下面的地方我们要放置一起其他的html元素。但当用户点击某个菜单项时,这个子菜单就展开,假设子菜单的大小是100px款和200px高,那就要求Siverlight所占的位置至少高为230px。由于Silverlight菜单只有30px高,所以下拉菜单就被截断而不能完整显示。我做的这个项目里三个Silverlight都遇到类似问题。例如PeoplePicker是在一个表格框里显示很多人的图像,当用户点击一个人的图像的时候弹出一个窗口以显示人的详细信息,在某种情况下,这个弹出窗口会超出包含所有人物图像的表格从而部分被截断。在《Silverlight嵌入到HTML之windowless属性及运用AjaxControlToolKit时出现虚线边框的问题》所描述的问题就是基于这种需求。

  上述问题是否可以简单的描述为:Silverlight程序在页面上只在指定的Silverlight plug in(<object/>元素)中显示,当超过Silverlight Plug in时就会被截除;当Silverlight程序的宽和高在运行时不确定时,就要求Silverlight Plug in的大小和位置随之改变以使所有silverlight内容都能完整正确的显示出来。

我在这个项目里的解决办法就是基于以上的描述,动态改变Silverlight plug in(object元素)的大小,并时silverlight plug in以绝对定位的方式浮动于其他元素之上,且让silverlight plug in的背景色为透明以不至于让他遮盖所有的底层元素。

  首先,我们在页面上定义一个<div>元素,我们的silverlight程序就放在这个<div>里,并以它作为silverlight的定位基准。即正常情况下silverlight和包含它的<div>的位置和大小完全一致。当需要改变silverlight的大小和位置时,也以该<div>为参考。在页面布局时,我们只用关注这个<div>应该放到哪就行了。HTML代码大致如下:

Code

<div id="silverlightHomePeoplePickerHost" style="width:275px;height:324px;background-color:transparent;float:left">

        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" style="width:100%;height:100%;position:absolute">

            <param name="source" value="../ClientBin/SEL.SonySource.Silverlight.HomePeoplePicker.xap"/>

            <param name="onerror" value="onSilverlightError" />

            <param name="onload" value="onSilverlightHomePeoplePickerLoaded" />

            <param name="background" value="transparent" />

            <param name="windowless" value="true" />

            <param name="minRuntimeVersion" value="2.0.31005.0" />

            <param name="autoUpgrade" value="true" />

            <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">

                 <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>

            a>

        object>

        <iframe style='visibility:hidden;height:0;width:0;border:0px'>iframe>

    div>

那么怎么初始化silverlight的位置和大小呢?就在onload事件里处理:

Code

var silverlightHomePeoplePickerInstance = null;

// When loaded the silverlight HomePeoplePicke in html page

function onSilverlightHomePeoplePickerLoaded(sender, args) {            

      silverlightHomePeoplePickerInstance = new SilverlightHomePeoplePicker(sender);

}

在onSilverlightHomePeoplePickerLoaded事件中,首先通过参数sender创建一个SilverlightHomePeoplePicker的实例,SilverlightHomePeoplePicker对象的代码大致如下:

Code

// the class of SilverlightHomePeoplePicker

function SilverlightHomePeoplePicker(sender) {

    this.slApp = sender;

    this.objElement = this.slApp.getHost();

    this.divContainer = this.objElement.parentNode;

    this.page = this.objElement.Content.
Page;

// the left and top offset to the directly parent element of silverlight object tag

    this.leftOffsetToContainer = 0;

    this.topOffsetToContainer = 0;

this.page.addEventListener("SilverlightScopeChanged", SilverlightHomePeoplePicker.createDelegate(this, this.handleSilverlightScopeChangedEvent));

    addEvent(window, "onresize", SilverlightHomePeoplePicker.createDelegate(this, this.setPosition));

with (this.objElement.style) {

        position = "absolute";

        zIndex = 999;

        width = this.divContainer.offsetWidth + "px";

        height = this.divContainer.offsetHeight + "px";

    }

this.setPosition();

}

SilverlightHomePeoplePicker.prototype = {

    // change scope of silverlight object tag

    handleSilverlightScopeChangedEvent: function(s, e) {

        this.leftOffsetToContainer = e.Left;

        this.topOffsetToContainer = e.Top;

        this.setPosition();

with (this.objElement.style) {

            width = e.Width + "px";

            height = e.Height + "px";

        }

    },

// set left and top positions

    setPosition: function() {

        setSilverlightObjectPosition(this.objElement, this.divContainer, this.leftOffsetToContainer, this.topOffsetToContainer);

    }

}

SilverlightHomePeoplePicker.createDelegate = function(instance, method) {

    return function() {

        return method.apply(instance, arguments);

    }

}

可以看到,在构造SilverlightHomePeoplePicker的实例时就设置了 <object/>元素的位置和大小。

  leftOffsetToContainer和topOffsetToContainer是指silverlight plug in ( object 元素 )左上相对于包含它的<div>的左上角的偏移量,一般正常情况下,这个偏移量为0,即silverlight与包含它的<div>左上角位置重叠。初始化时同时设置了silveright插件的宽和高,即等于包含它的<div>的宽和高。

  那么当Silverlight的位置和大小需要改变时怎么办呢?谁来负责处理这个变化呢?首先,在Silverlight程序里应该最先知道这个Silverlight程序的范围是否改变了,是否需要改变silverlight plug in的位置和大小来正确显示整个Silverlight的内容。例如,当弹出或关闭详细信息窗口时,Silverlight程序应该做这个检查,如果需要改变silverlight plugin的位置和大小,就通知javascript程序。

  Silverlight的启动xmal文件Page.xaml大概是这个样子:

Code

<UserControl x:Class="SEL.SonySource.Silverlight.HomePeoplePicker.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

    Width="275" Height="324">   

    

    <Grid x:Name="LayoutRoot" RenderTransformOrigin="0,0">

<Grid.RenderTransform>

            <TranslateTransform x:Name="LayoutRootTranslate" X="0" Y="0" />

        Grid.RenderTransform>        

    Grid>

UserControl>

  然后定义一个SilverlightScopeChangeHandler:

Code

/// 

    /// When the scope of the app changed, call the handler to invoke js to resize the position of the plug-in object

    /// Most time, this will be triggered by popup or close the detail window

    /// 

    /// 

    /// 

    public delegate void SilverlightScopeChangedHandler(Object sender, ScopeEventArgs e);

/// 

    /// Indicate the scope of the silverlight app

    /// 

    public class ScopeEventArgs : EventArgs

    {

        /// 

        /// Relative to the orginal left position, it will always less than 0

        /// 

        [ScriptableMember]

        public double Left

        {

            get;

            internal set;

        }

/// 

        /// Relative to the orginal top position, it will always less than 0

        ///

时间: 2024-09-28 12:29:38

简单探照灯遮照效果的Silverlight程序的相关文章

一起谈.NET技术,Silverlight 游戏开发小技巧:透明背景的Silverlight程序

一些朋友在玩窝窝世界的时候,发现官方网站上的进入入口程序是Silverlight,但是有趣的是一个透明背景的Silverlight程序,这个效果最早我也未找资料,在未来Silverlight程序会在各个方面应用,透明背景的效果就会涉及,这种效果预览如下: 下面一步一步的告诉大家这个小技巧,首先要准备一个Silverlight,然后将MainPage的填充色设置为透明的,还有LayoutRoot也是一样,我在这里用了一张来自网络的图片: 为了稳定,最好将MainPage的宽高定死,这样有助于我们在

Silver“.NET研究”light 游戏开发小技巧:透明背景的Silverlight程序

一些朋友在玩窝窝世界的时候,发现官方网站上的进入入口程序是Silverlight,但是有趣的是一个透明背景的Silverlight程序,这个效果最早我也未找资料,在未来Silverlight程序会在各个方面应用,透明背景的效果就会涉及,这种效果预览如下: 下面一步一步的告诉大家这个小技巧,首先要准备一个Silverlight,然后将MainPage的填充色设置为透明的,还有LayoutRoot也是一样,我在这里用了一张来自网络的图片: 为了稳定,最好将MainPage的宽高定死,这样有助于我们在

Silverlight 游戏开发小技巧:透明背景的Silverlight程序

一些朋友在玩窝窝世界的时候,发现官方网站上的进入入口程序是Silverlight,但是有趣的是一个透明背景的Silverlight程序,这个效果最早我也未找资料,在未来Silverlight程序会在各个方面应用,透明背景的效果就会涉及,这种效果预览如下: 下面一步一步的告诉大家这个小技巧,首先要准备一个Silverlight,然后将MainPage的填充色设置为透明的,还有LayoutRoot也是一样,我在这里用了一张来自网络的图片: 为了稳定,最好将MainPage的宽高定死,这样有助于我们在

利用JS实现简单的瀑布流效果

哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了, 虽然中间非常的坎坷, 并不是一帆风顺但是最终我还是实现了个简单的效果, 下面就为大家简单的介绍下, 不知道的友友们, 有兴趣的话, 可以来参考下, 欢迎指出缺点和不足! 一.瀑布流之准备工作    首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的,

flash实现的简单虚拟现实:商品展示效果

效果演示: 用鼠标在茶壶上拖动,看看效果! 忘了什么时候在什么地方看到的一个旋转效果,脑子便热了一下,正好偶刚学了一点3DMAX, 偶便仿造了这么一个超简单超幼稚的效果.希望大家借方法别借效果,不然偶可是成了罪人了,误人子弟可就不好了,好,我马上介绍一下大致的做法: 首先你要会点3DMAX,不用太厉害,偶也是菜鸟级别的,不过想要做好的物品展示的话又不能对物品进行各角度拍摄的话,就学好3DMAX吧,偶正在努力成为CG高手,哈哈哈.有兴趣做CGER的朋友可以家我的QQ:258597679 其实这个茶

网站片头二—效果篇:遮照效果

在片头中有效地运用遮照无疑会给片头增添很大的效果,现在我们来看怎么制作遮照效果.我们以文字过光效果为例子.  效果演示:  点击这里下载源文件 1. 首先新建文档,在场景中输入文字: 2. 新建一层,复制原文字,点击原位粘贴,同时把第二层文字颜色改为白色,并把二层文字打散. 3新建层三,画一个矩形 4. 在第15针转换为关键针,把矩形放到文字尾部作形状动画: 5. 将层三转化为遮照层,遮照第二层. 当然如果你发挥你的想象力,遮照可以帮你作出很多很棒的效果. 四.我们平常经常会看见一些小箭头,圆之

教你用Fireworks简单制作残破边缘效果

  本教程是向大家介绍如何利用Fireworks制作残破边缘效果,制作方法非常简单,就是运用钢笔来勾,非常适合初学Fireworks朋友学习,转发过来,希望大家喜欢 先来看看效果图: 制作方法如下: 以上就是用Fireworks简单制作残破边缘效果,是不是很简单,感兴趣的朋友快点来动手吧.

PhotoShop制作简单的球形文字效果教程

教大家制作一个简单的球形文字效果,很容易做,比较适合新手朋友,主要用到滤镜. 国际惯例,效果先上:想学就往下看! 1.新建文档,输入文字,栅格化文字,持行椭圆选区按钮,按住SHIFT键,创建正圆, 2.持行滤镜-扭曲-球面化(数量:100% 模式:正常) , 3.合并可见图层, 4.再持行滤镜-渲染-镜头光晕 (默认值) (始终不能取消选区哦) 5.新建文档 选区内容移动到新文档,双击,跳出图层样式,投影(距离:17,大小:25 其他默认值)嘻嘻 6.效果出来了,随便加点东西 分类: PS文字教

JQUERY简单按钮轮换选中效果实现方法

  这篇文章主要介绍了JQUERY简单按钮轮换选中效果实现方法,涉及jQuery鼠标事件与css样式操作的基本技巧,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <html> <head> <meta http-equiv="Content-Type" content="text/html