.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 アプリケーション」プロジェクト・テンプレートで自動生成されるクラス(ファイル)である。
|
||
コンテンツ・リサイズ時のイベント・ハンドラを実装したサンプル・コード(上:C#、下:VB) |
■Silverlightコンテンツ領域のサイズを取得する方法
次に、Silverlightコンテンツ領域のサイズを取得する。これには、先ほど取得したContentオブジェクトのActualWidthプロパティ(実際の横幅)とActualHeightプロパティ(実際の高さ)を使う。これらのプロパティで取得/設定する値は、Double型である。
次のコードは、コンテンツがリサイズされたときに、ActualWidthプロパティとActualHeightプロパティにより横幅と高さを取得して、その数値をTextBlockコントロールに表示するのイベント・ハンドラの記述例である。
|
||
Silverlightコンテンツ領域のサイズを取得するサンプル・コード(上:C#、下:VB) |
なお、ActualWidthプロパティやActualHeightプロパティから値の取得を行うのは、ロードが完全に終わって、コントロールが実際に描画された後でなければならない。例えば、Pageクラスのコンストラクタ内などで取得しようとしても、正確な値が返ってこない場合があるので、注意してほしい(※筆者が試した限り、本TIPSのように、Resizedイベント・ハンドラでは正確な値が取得できるようだ)。
カテゴリ:Silverlight 2 処理対象:ブラウザ 使用ライブラリ:SilverlightHostクラス(System.Windows.Interop名前空間) 使用ライブラリ:Contentクラス(System.Windows.Interop名前空間) 使用ライブラリ:Applicationクラス(System.Windows名前空間) |
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|