.NET TIPS

[Silverlight 2]Silverlightコントロールの実際のサイズを取得するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2009/08/27

 Silverlightアプリケーションは、Webページ上に自由なサイズで貼り付けられる。また、ユーザーによりWebブラウザのウィンドウ・サイズが変更されたなどの理由で、HTMLコンテンツ内に埋め込まれたSilverlightコントロール(=<object>要素)のサイズが変更される、つまりSilverlightコンテンツ領域のサイズが変更されることもある(「Silverlightコントロール(=<object>要素)のサイズ」と「Silverlightコンテンツ領域のサイズ」は一致する)。このように状況によっては(例えばユーザーの操作やJavaScriptコードによる動的な変更などがあった場合では)、Silverlightコンテンツ領域のサイズが動的に変化する可能性がある。

 Silverlightアプリケーションによっては、このようなコントロールのリサイズに合わせて、コンテンツ内を最適な表示内容に再構成したい場合もあるだろう。

 そこで本TIPSでは、リサイズされたタイミングで、Silverlightコンテンツ領域のサイズ(横幅と高さ)を取得する方法を説明する。

 次のサンプルでは、Silverlightアプリケーションのボタンをクリックすると、Silverlightコントロールのサイズを変更して、Silverlightコンテンツ領域の横幅と高さを取得する。

Silverlightコンテンツ領域のサイズを取得するサンプル

■Silverlightコンテンツ領域のリサイズ時のイベント・ハンドラ

 Silverlightコンテンツ領域がリサイズされたときには、Contentクラス(System.Windows.Interop名前空間、System.Windows.dllアセンブリ)のオブジェクトのResizedイベントが発生する。

 Contentオブジェクトは、次のプロパティから取得できる。

App.Current.Host.Content

 Silverlightアプリケーションを示すApplicationクラス(System.Windows名前空間)には、現在のApplicationオブジェクトを取得するための静的プロパティCurrentがある。上記コードの「App」は、そのApplicationクラスを継承したクラス(SilverlightApplication1名前空間)である。

 そして、AppクラスのCurrentプロパティからApplicationオブジェクトを取得し、そのHostプロパティからSilverlightHostクラス(System.Windows.Interop名前空間)のオブジェクトを取得する。そこからSilverlightコントロールの情報を取得/設定したり、オブジェクトを操作したりできる。

 今回は、SilverlightHostオブジェクトのContentプロパティを呼び出している。Contentプロパティからは、Silverlightアプリケーションのコンテンツ領域に関するAPIが含まれるContentクラス(System.Windows.Interop 名前空間)のオブジェクトが取得できる。

 あとは、このContentオブジェクトが持つResizedイベントに、イベント・ハンドラとなるメソッドを設定すればよい。

 Resizedイベント・ハンドラを設定するタイミングは、メイン・ページ(RootVisual)となるPageクラス内のコンストラクタがよいだろう。Contentオブジェクトは、本稿の後半のコードでも使用したいので、メンバ・フィールド変数(本稿では「hostContent」)にしておこう。以上をまとめると、次のようなコードになる。

 なおAppクラスやPageクラスは、Visual Studioの「Silverlight アプリケーション」プロジェクト・テンプレートで自動生成されるクラス(ファイル)である。

Content hostContent;

public Page()
{
  InitializeComponent();

  hostContent = App.Current.Host.Content;
  hostContent.Resized += new EventHandler(Content_Resized);
}

void Content_Resized(object sender, EventArgs e)
{
  // 以下で実装
}
Dim hostContent As Content

Public Sub New()
  InitializeComponent()

  hostContent = App.Current.Host.Content
  AddHandler hostContent.Resized, AddressOf Content_Resize
End Sub

Private Sub Content_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs)
  ' 以下で実装
End Sub
コンテンツ・リサイズ時のイベント・ハンドラを実装したサンプル・コード(上:C#、下:VB)

■Silverlightコンテンツ領域のサイズを取得する方法

 次に、Silverlightコンテンツ領域のサイズを取得する。これには、先ほど取得したContentオブジェクトのActualWidthプロパティ(実際の横幅)とActualHeightプロパティ(実際の高さ)を使う。これらのプロパティで取得/設定する値は、Double型である。

 次のコードは、コンテンツがリサイズされたときに、ActualWidthプロパティとActualHeightプロパティにより横幅と高さを取得して、その数値をTextBlockコントロールに表示するのイベント・ハンドラの記述例である。

void Content_Resized(object sender, EventArgs e)
{
  textBlockInfo.Text = String.Format(
    "幅:{0}px、高さ:{1}px",
    hostContent.ActualWidth, hostContent.ActualHeight);
}
Private Sub Content_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs)
  textBlockInfo.Text = String.Format( _
    "幅:{0}px、高さ:{1}px", _
    hostContent.ActualWidth, hostContent.ActualHeight)
End Sub
Silverlightコンテンツ領域のサイズを取得するサンプル・コード(上:C#、下:VB)

 なお、ActualWidthプロパティやActualHeightプロパティから値の取得を行うのは、ロードが完全に終わって、コントロールが実際に描画された後でなければならない。例えば、Pageクラスのコンストラクタ内などで取得しようとしても、正確な値が返ってこない場合があるので、注意してほしい(筆者が試した限り、本TIPSのように、Resizedイベント・ハンドラでは正確な値が取得できるようだ)。End of Article

カテゴリ:Silverlight 2 処理対象:ブラウザ
使用ライブラリ:SilverlightHostクラス(System.Windows.Interop名前空間)
使用ライブラリ:Contentクラス(System.Windows.Interop名前空間)
使用ライブラリ:Applicationクラス(System.Windows名前空間)

この記事と関連性の高い別の.NET TIPS
[Silverlight 2]JavaScriptコードからSilverlightのオブジェクトを利用するには?
[Silverlight 2]マウス・オーバー時にSilverlightコントロールを大きく表示するには?
[Silverlight 2]HTML要素クリック時にSilverlightのメソッドを実行するには?
[Silverlight 2]Silverlightアプリケーションをフルスクリーンで表示するには?
[Silverlight 2]Silverlightプラグイン・ロード時にJavaScriptコードを実行するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間