在页面上传递参数给Silverlight插件

  近期直接在做Silverlight插件,用来在页面上显示一些卡通效果和录像播放,有关怎么样通过页面传递参数给Silverlight插件已经是一个老生常谈的话题了,然则我依然想在此处再一次做下记录,方便新人学习,也利于温馨之后查阅。

  我们都清楚,大家在页面上应用Silverlight插件一般都选拔上边那种标记,当然你也得以在aspx页面中使用silverlight标记,不过那种格局用得很少,而且只限于在aspx页面上行使。

<object data=”data:application/x-silverlight-2,” type=”application/x-silverlight-2″ width=”100%” height=”100%”>
  <param name=”source” value=”ClientBin/SilverlightTest.xap”/>
  <param name=”onError” value=”onSilverlightError” />
  <param name=”background” value=”white” />
  <param name=”minRuntimeVersion” value=”3.0.40624.0″ />
  <param name=”autoUpgrade” value=”true” />
  <a 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>

   与flash插件类似,在页面上运用的也是一个object标记,大家得以经过已有些param参数来修改silverlight插件的有的属性,例如大家得以选用source来须求silverlight插件使用差别的xap文件,使用onError设置Silverlight加载出错时要实施的台本,使用background参数设置silverlight插件的背景象,以及利用minRuntimeVersion参数需要客户端运行Silverlight插件的细微版本号,使用autoUpgrade参数需要是或不是同意客户端的Silverlight浏览器插件自动升级等等。除此之外,你还足以自定义参数,大家可以利用initParams来定名参数,通过该参数我们可以而且传递三个值给Silverlight,如上边的代码:

<object data=”data:application/x-silverlight-2,” type=”application/x-silverlight-2″ width=”100%” height=”100%”>
  <param name=”source” value=”ClientBin/SilverlightTest.xap”/>
  <param name=”onError” value=”onSilverlightError” />
  <param name=”background” value=”white” />
  <param name=”minRuntimeVersion” value=”3.0.40624.0″ />
  <param name=”autoUpgrade” value=”true” />
  <param name=”initParams” value=”programmer=Jaxu,
blog=http://www.cnblogs.com/jaxu, title=silvelight” />
  <a 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>

   大家经过name/value对来设定initParams参数的值,如上例中就传递了七个分裂的参数programmer、blog和title。在服务器端怎样选择那个值吗?看下边的演示,首先咱们须求在App.xaml.cs文件的Application_Startup事件中加载这么些参数的值。

private void Application_Startup(object sender, StartupEventArgs e)
{
  if ( e.InitParams != null )
  {
    foreach ( var item in e.InitParams )
    {
      this.Resources.Add( item.Key, item.Value );
    }
  }
      
2018正版葡京赌侠诗,  this.RootVisual = new Page();
}

   通过遍历InitParams,大家将参数以键-值对的花样加载到Silverlight全局资源集合中,最终一行代码是Silverlight默许的代码。使用的时候我们得以经过参数名从Silverlight全局资源汇集中取出相应的值,可以写成一个函数方便调用。

private string GetParam(string p)
{
  if ( App.Current.Resources[p] != null )
  {
    return App.Current.Resources[p].ToString();
  }
  else
  {
    return string.Empty;
  }
}

   那样大家就可以轻松地收获到页面上传递过来的参数了。即使必要传递的参数过多,除了利用name/value对的款型外,大家还足以将参数写到xml里,如大家相比熟习的playList,将录像播放要运用的参数写到playList
xml里,然后在Application_Startup事件中解析xml并加载参数的值,使用xml的格局便于组合和管制参数。

  其余,有时候大家也急需在Silverlight中已毕与页面DOM之间的交互。在Silverlight中,大家得以因而HtmlPage.Plugin来博取页面上用来表现Silverlight插件的object标签,通过HtmlPage.Plugin.Parent.Id就足以获取父容器的id,如div或者td。除此之外,还是可以透过HtmlPage.Document.GetElementById(“elementID”)来博取一个页面上的控件,该办法重临HtmlElement对象,通过该目标的SetProperty(“PropertyName”)办法可以修改控件的属性值,通过GetProperty(“PropertyName”)艺术能够收获控件的属性值。那样,大家就足以兑现Silverlight插件和页面元素之间的并行了。

  有时候我们会遇上一些小意思,例如我们想让页面上的因素(如div)浮动到Silverlight元素之上,默许意况下Silverlight总会展现在富有页面元素之上,那时你可以给页面上的object对象传递一个参数Windowless,将值设为true,让Silverlight插件以“无窗体”的款式表现就足以了。

  还有一种景况,就是当Silverlight插件在进行一个动画片时,动画所主宰的要素会超出Silverlight插件本身的范围,那时如若Silverlight插件周围存在页面上的别样容器控件(如div),而Windowsless的值又为true,此时超出去的一对就会被旁边的容器挡住。那时大家就须要通进程序来动态控制Silverlight父容器控件的分寸和ZIndex值,同时还索要将Silverlight插件的背景观设置为透明。上边的代码显示了这点技术。

public partial class MainPage : UserControl
{
    private string divID = string.Empty;
    private HtmlElement element;
    private double originalWidth = 0;
    private double originalHeight = 0;
    private double naturalWidth = 865;
    private double naturalHeight = 410;
    private int state = 0;

    public MainPage()
    {
        // Required to initialize variables
        InitializeComponent();

        divID = HtmlPage.Plugin.Parent.Id;
        element = HtmlPage.Document.GetElementById(divID);
        originalWidth = Convert.ToDouble(element.GetProperty(“offsetWidth”));
        originalHeight = Convert.ToDouble(element.GetProperty(“offsetHeight”));
    }

    // Zoom in.
    private void videoToggleButton_Checked(object sender, RoutedEventArgs e)
    {
        SetPropertiesBeforeZoomedIn();
        videoZoomInStoryboard.Begin();
    }

    // Zoom out.
    private void videoToggleButton_Unchecked(object sender, RoutedEventArgs e)
    {
        videoZoomOutStoryboard.Begin();
    }

    private void ZoomOutStoryboard_Completed(object sender, EventArgs e)
    {
        if (state.Equals(0))
        {
            SetProperitesAfterZoomedOut();
        }
    }

    private void SetPropertiesBeforeZoomedIn()
    {
        element.SetStyleAttribute(“width”, naturalWidth.ToString() + “px”);
        element.SetStyleAttribute(“height”, naturalHeight.ToString() + “px”);
        element.SetStyleAttribute(“zIndex”, “100”);
    }

    private void SetProperitesAfterZoomedOut()
    {
        element.SetStyleAttribute(“width”, originalWidth.ToString() + “px”);
        element.SetStyleAttribute(“height”, originalHeight.ToString() + “px”);
        element.SetStyleAttribute(“zIndex”, “0”);
    }
}

  一先河先后会把Silverlight父容器的高和宽记录下来,事件videoToggleButton_Checked和事件videoToggleButton_Unchecked会分别实施一个松手和紧缩的卡通片进程,在加大进程执行前程序会将容器的高和宽设定为预期的值并同时修改ZIndex,那时Silverlight插件就会显得在具有页面容器的最上边并且不会被广泛的器皿挡住;在缩短进度执行完后程序再将容器的高和宽设定为前期的值并同时修改回ZIndex,此时Silverlight插件就会死灰复燃到最初的场地。你可能会问何故大家不可以只设定容器的ZIndex值而还要同时修改它的分寸呢?那是因为当Silverlight插件被放大或裁减时它的父容器的尺寸并不会随着一起改变,这时尽管你将父容器的ZIndex值改成最徐熙媛(Barbie Hsu)ilverlight插件依旧会被父容器本身挡住。

  在拓展Silverlight插件和页面元素之间相互时还会有广大的技能,其实只要认真研商下,应该不会有怎样问题无法缓解!

相关文章