locked
mediaelementのsourceをASP.NETのページから設定するには RRS feed

  • 質問

  • こんにちは
    Visual Web Developper 2008 + Silverlight2 SDKの環境にてSilverlightアプリケーションVideoPageを作成するとします。
    ASP.NETの別ページからのリンクでVideoPage.Webを表示したときに、VideoPage.Web/Default.aspx?ID=1等の形にて受け取ったQueryStringのIDに基づいてPage.xaml.cs内のmediaelementのSourceを設定したいと考えていますが、Default.aspxからデータを送信し、Page.xaml.csでデータを受け取る方法が思い浮かびません。
    どのように行うかご教示いただけますでしょうか。




    • 移動 Wang Huang 2012年10月1日 9:45 (移動元:Silverlight - ビデオとメディア)
    2009年5月20日 5:19

すべての返信

  • ここでは、HTTP GETによるパラメータ渡しを使い、ASP.NETからSilverlightプラグインへinitParamプロパティ経由で値を渡し、Silverlightのアプリケーションの初期化時点でinitParamの内容を解析することを考えてみます。
    メディア以外の場合でも応用できると思います。

    MediaElementのSourceプロパティに渡す文字列を組み立てるという問題になるので、そこだけに着目して実装例を示したいと思います。
    あえて、Silverlight 3向けに書いてます。ポイントを理解してしまえば、Silverlight 2でも同じことが実現できると思います。

    [Default.aspx] ASP.NET Silverlightコントロールを使い、App1という名前をつける

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SL_DynamicMedia01.Web._Default" %>
    <%@ Register Assembly="System.Web.Silverlight" Namespace="System.Web.UI.SilverlightControls"
        TagPrefix="asp" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <head id="Head1" runat="server">
        <title>SL-DynamicMedia01</title>
        <style type="text/css">
        html, body {
    	    height: 100%;
    	    overflow: auto;
        }
        body {
    	    padding: 0;
    	    margin: 0;
        }
        </style>
    </head>
    <body>
        <form id="form1" runat="server" style="height:100%;">
            <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
            <div  style="height:100%;">
                <asp:Silverlight ID="App1" runat="server" Source="~/ClientBin/SL-DynamicMedia01.xap" MinimumVersion="3.0.40307.0" Width="100%" Height="100%" />
            </div>
        </form>
    </body>
    </html>


    [Default.aspx.cs] Page_Loadメソッド内で、SilverlightプラグインのinitParamプロパティを設定する
    ASP.NET Silverlightコントロールを使った場合は、InitParametersプロパティを利用する

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace SL_DynamicMedia01.Web
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                App1.InitParameters = "mediaUri="+GetMediaUriString(Request.QueryString["ID"]);
            }
    
            string GetMediaUriString(string id)
            {
                string mediaUri;
                // サンプルのため、単純な文字列操作にしているが
                // ここでは、データベースなどを参照し、
                // IDとメディアファイルのマッピングを行っていると仮定する
                mediaUri = "file" + id + ".wmv";
                return mediaUri;
            }
    
        }
    }
    


    [App.xaml.cs] Application_Startupで、InitParamを解析し、MainPageクラスのコンストラクタに渡す

    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;
    
    namespace SL_DynamicMedia01
    {
        public partial class App : Application
        {
            public App()
            {
                this.Startup += this.Application_Startup;
                this.Exit += this.Application_Exit;
                this.UnhandledException += this.Application_UnhandledException;
                InitializeComponent();
            }
    
            private void Application_Startup(object sender, StartupEventArgs e)
            {
                string mediaUri;
                mediaUri = e.InitParams["mediaUri"];
                this.RootVisual = new MainPage(mediaUri);
            }
    
            private void Application_Exit(object sender, EventArgs e)
            {
    
            }
            private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
            {
                // アプリケーションがデバッガーの外側で実行されている場合、ブラウザーの
                // 例外メカニズムによって例外が報告されます。これにより、IE ではステータス バーに
                // 黄色の通知アイコンが表示され、Firefox にはスクリプト エラーが表示されます。
                if (!System.Diagnostics.Debugger.IsAttached)
                {
    
                    // メモ : これにより、アプリケーションは例外がスローされた後も実行され続け、例外は
                    // ハンドルされません。 
                    // 実稼動アプリケーションでは、このエラー処理は、Web サイトにエラーを報告し、
                    // アプリケーションを停止させるものに置換される必要があります。
                    e.Handled = true;
                    Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
                }
            }
            private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
            {
                try
                {
                    string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
                    errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
    
                    System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
                }
                catch (Exception)
                {
                }
            }
        }
    }
    


    [MainPage.xaml] MediaElementについては省略

    <UserControl x:Class="SL_DynamicMedia01.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Width="400" Height="300"
        xml:lang="ja-jp">
        <Grid x:Name="LayoutRoot" Background="White">
            <TextBlock x:Name="txtMediaUri" Text="ここにメディアのURLが表示されます" />
        </Grid>
    </UserControl>
    


    [MainPage.xaml.cs] MainPageのコンストラクタのパラメータでメディアのUriを受け取る

    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;
    
    namespace SL_DynamicMedia01
    {
        public partial class MainPage : UserControl
        {
            public MainPage(string mediaUri)
            {
                InitializeComponent();
                txtMediaUri.Text = mediaUri;
            }
        }
    }
    

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。
    2009年5月27日 12:32