.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」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


