Silverlight
Silverlight のプログラミング モデル、XAML、および HTML DOM

ブラウザー ホストで Silverlight プラグインを使用する Silverlight ベースのアプリケーションの機能は、ブラウザー ベースのドキュメント オブジェクト モデル (DOM) と、オブジェクト ツリーの概念を含む Silverlight 固有のプログラミング モデルを通じて公開されます。 Silverlight プログラミング モデルを使用するときに、3 種類の API から 1 つを選択できます。その 3 種類とは、ブラウザーによって解釈される JavaScript、マネージ コード、または DLR (動的言語ランタイム) によって解釈される動的言語です。 ここでは、DOM と API の各バリエーションとの関係について説明した後、各種の API およびアプリケーション モデルでどのように XAML マークアップが使用されるかについて説明します。

このトピックには次のセクションが含まれています。

ドキュメント オブジェクト モデル

ドキュメント オブジェクト モデル (DOM) は、プラットフォームや言語に依存しないプログラミングの一般的な概念です。 DOM は、Web ページなどのドキュメントを構造的に表現すると共に、ドキュメントの構造、スタイル、コンテンツに対し、決められた方法でアクセスし、操作することを可能にします。 Silverlight ランタイムをプラグインとしてホストできるブラウザーでは、Silverlight プラグインを含む HTML ページの要素を公開する HTML DOM をそれぞれ実装します。

人気の高いブラウザーの多くは、その DOM を W3C (World Wide Web Consortium) の DOM 標準に基づいて実装しています。 ただし、ほとんどのブラウザーは、W3C 標準にはない拡張機能を備えています。 したがって、プラットフォームに依存しないコンテンツを作成するためには、開発者はこうした違いを意識する必要があります。次の表に、Silverlight へのアクセスに対応しているブラウザー DOM の一覧を示します。

DOM

説明

Gecko DOM (Mozilla、Firefox、Netscape Version 6 以降、およびその他 Mozilla ベースのブラウザー)

Gecko は、HTML 解析、ページのレイアウト、ドキュメント オブジェクト モデル、アプリケーション全体のレンダリングなどを処理するソフトウェア コンポーネントです。 詳細については、「Gecko DOM Reference」を参照してください。

DHTML DOM (Internet Explorer)

Dynamic HTML (DHTML) DOM を使用すると、Web ドキュメントのさまざまな構成要素 (個々の要素、コンテナーなど) に対し、直接、プログラムからアクセスできます。 詳細については、「About the DHTML Object Model」を参照してください。

Silverlight プラグインの作成後 (通常、HTML object タグを使用します)、HTML DOM でその ID を参照することによって、プラグイン インスタンスへの参照を取得できます。 次の JavaScript は、document.getElementById メソッドを使用して、Silverlight プラグインの ID を取得する例です。

var plugin_1 = document.getElementById("SLPlugin_1");
Silverlight のプログラミング モデル

Silverlight API には、XAML を読み込むことで Silverlight ベースのアプリケーションの初期コンテンツを設定し、実行時にオブジェクト ツリーを調整するための一連のオブジェクトがオブジェクト ツリーとして定義されています。 Silverlight のオブジェクト ツリーは、Web ページでインスタンスとして作成できる Silverlight プラグインを通じて公開されます。Microsoft Internet Explorer には ActiveX のプラグイン モデルが、その他のブラウザーには Netscape API のプラグイン モデルがそれぞれ Silverlight によって使用されます。 マネージ API または JavaScript API を使用して Silverlight 用のプログラムを作成できます。ほとんどのシナリオでは、マネージ API を使用します。

XAML と Silverlight のオブジェクト ツリー

Silverlight プラグインの内容を指定することは、ルート要素下に階層的なツリー構造を持った要素をマークアップに XAML 要素を定義することになります。この内容は、最初に object タグの source パラメーターで宣言します (マネージ API を使用している場合は指定した内容が Silverlight アプリケーション モデルによって処理されます)。 解析された XAML により、Silverlight の初期オブジェクト ツリーが作成されます。

マネージ API

次の例では、UserControl をルート要素とし、TextBlock オブジェクトと Canvas オブジェクトを子として持つマークアップ階層が作成されます。 この例はマネージ API 用であり、XAP パッケージからの指定されたエントリ ポイント クラスおよび Silverlight ベースのアプリケーションのアプリケーション マニフェストを表します。

XAML
<UserControl x:Class="SilverlightApplication1.Page"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  <StackPanel>
    <Rectangle
      Width="200" Height="35"
      Fill="PowderBlue" />
    <TextBlock
      Foreground="Teal" FontFamily="Verdana" FontSize="18" FontWeight="Bold"
      Text="Sample Output" />
  </StackPanel>
</UserControl>

マネージ API の場合は、XAML が解析される前に、開発者のコンピューターでマークアップ コンパイラによってコンパイルされます。 この概念の詳細については、「分離コードと部分クラス」を参照してください。

クライアントで実行時に XAML が読み込まれて解析されると、パーサーでこのマークアップからオブジェクト ツリーが作成されます。 オブジェクト ツリーのルートは、UserControl オブジェクトになります。 実際、オブジェクト ツリーには、特定の UserControl サブクラスのインスタンス、つまり、ルート要素の x:Class 属性で参照された Page クラスが格納されます。

実行時に Silverlight ベースのアプリケーションを操作する場合は、Silverlight のマネージ API を使用して、Page クラスにアクセスします。 作成されたオブジェクト ツリーの Page ルートを越えて、Application オブジェクトにアクセスすることもできます。 Silverlight のコンテンツ領域に表示される UI のページ全体を XAML 形式での表現に置き換えたとしても、Silverlight ベースのアプリケーションが持つさまざまな側面には、Application からそのままアクセスできます。Application には、アプリケーション レベルのリソースや、HTML DOM に関連付けられているオブジェクトが存在するほか、アプリケーションのパーツを含んだパッケージにアクセスすることもできます。 詳細については、「アプリケーション モデル」を参照してください。

Loose XAML

マネージ API のシナリオによっては、Loose XAML、つまり Silverlight XAP パッケージにコンテンツとして格納されている XAML ファイル、または URL でアクセスされる XAML ファイルを読み込むことができます。 この XAML では、x:Class の宣言や、分離コードの使用はできません。 このようなシナリオの例として、マージされたリソース ディクショナリ、ユーザー固有のリソース、または Load のコンテンツ文字列があります。 この Loose XAML とオブジェクト ツリーの残りの部分の関係は実際のシナリオよって異なるため、ここでは説明しません。

JavaScript API

次の例では、ルート Canvas オブジェクトを持つマークアップ階層が作成されます。 この例は JavaScript API 用であり、Silverlight をホストする HTML ページと同じサーバーによってサービスが提供される個々の XAML ファイルを表します。 この場合、XAML ファイルはパッケージ化されていません。また、マークアップ コンパイラによるコンパイルも行われていません。

XAML
<StackPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  <Rectangle
    Width="200" Height="35"
    Fill="PowderBlue" />
  <TextBlock
    Foreground="Teal" FontFamily="Verdana" FontSize="18"
    FontWeight="Bold"
    Text="Sample Output" />
</StackPanel>

また、この XAML は、基本的な UI も定義します。 実際、この XAML は、外見上は前の例と同じです。 パーサーでこの XAML を解析すると、マークアップからオブジェクト ツリーが作成されます。 このオブジェクト ツリーのルート要素は、StackPanel になります。

実行時に Silverlight ベースのアプリケーションを操作する場合は、オブジェクト ツリー全体にすぐにアクセスできるわけではありません。 DOM 内の Silverlight プラグインを参照するために作成した変数にアクセスすることはできますが、それ以外の場合、通常はイベント ハンドラーの sender を介してプログラミング モデルにアクセスします。 この sender は、オブジェクト ツリー内のオブジェクトで、任意の Silverlight API から利用できます。 ただし、sender は、通常は HTML DOM から利用できません。DOM は、ホスト object タグのレベルで停止します。

すべての Name / x:Name 参照は、実行時に JavaScript API によって使用されますが、初期の唯一の使用法は FindName 呼び出しのターゲットとしての役割です。 FindName 呼び出しを行って初めて、オブジェクト ツリーに実際のオブジェクトが含められます。これよりも前の時点では、オブジェクトの名前は単なる文字列であり、オブジェクトではありません。 通常は、Name に使用されている文字列と同じ変数名を使用します。この慣例は、同じ XAML を使用して JavaScript の分離コードをマネージ コードの分離コードに移行する場合に非常に有用です。

ブラウザー以外のホスト

Silverlight をホストするのは、ブラウザーでなくてもかまいません。 Silverlight ベースのアプリケーションのブラウザー外実行を採用したり、別のホスト フレームワークを記述したりもできます。 このような場合は、アプリケーションで完全な DOM およびスクリプトを利用できないことがあります。 詳細については、「ブラウザー外実行のサポート」または「さまざまなホスティング方法」を参照してください。

参照

その他の技術情報

タグ :


Page view tracker