mediaelementのsourceをASP.NETのページから設定するには
-
2009年5月20日 5:19こんにちは
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でデータを受け取る方法が思い浮かびません。
どのように行うかご教示いただけますでしょうか。
すべての返信
-
2009年5月27日 12:32
ここでは、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 をご覧ください。

