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

2019-10-15 07:40 来源:未知

  目前径直在做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="" style="text-decoration:none">
      <img src="" 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=, title=silvelight" />
  <a href="" style="text-decoration:none">
      <img src="" 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 );
    }
  }
      
  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值改成最大Silverlight插件仍旧会被父容器本身挡住。

  在展开Silverlight插件和页面成分之间交互时还应该有成百上千的技艺,其实只要认真探究下,应该不会有怎样难点不可能消除!

TAG标签:
版权声明:本文由银河国际点击登录发布于升级网络游戏,转载请注明出处:在页面上传递参数给Silverlight插件