メールにて、質問をいただきました。タイトルのように、・・・あれ?逆だ。ブラウザのサイズ変更にコントロールを追従させる、だ。
私も知りません。
ではつまらないので、調べます。
まず、ドキュメント。CHM なドキュメントには、クラス ライブラリの説明だけでなく、技術背景なども書かれています。目次でいうと、「Silverlight の概要」「はじめに」のあたりです。このあたりは、時間を作って一度目を通しておくことを勧めます。で、「ビジュアル デザイン」→「Silverlight のレイアウト システム」のあたりが該当しそうです。読んでいくと、「全画面表示サポート」の中に、Content.ActualWidth プロパティへの参照があります。これっぽいです。
で、「Content.ActualWidth プロパティ」の説明を読んでいくと、表示が完了した直後に Resized イベントが発生し、それ以降に ActualWidth プロパティで現在の実際の横幅が取れるとあります。
じゃぁ、ってんで、Resized イベントのハンドラを追加してみます。すると、Page クラスについては SizeChanged イベントが発生するようです。なので、こっちをハンドルします。すると、SizeChangedEventArgs クラスが引数として付いてきます。この中の NewSize プロパティと PreviousSize プロパティで、変更前後の…書く順番間違えているけど…サイズが参照できます。なので、これを表示させます。
SizeChanged イベントが、一度しか発生しません。
どうも、Silverlight plug-in を呼び出している object 要素に指定した width, height 属性のために、サイズが変化しないようです。ですから、このサイズの指定を絶対値からパーセンテージに変更してみます。
やはり、一度しか発生しません。
よく見ると、Page.xaml に Width, Height プロパティを指定しています。これの説明を見ると、"Auto" という値も指定できるということです。なので、"Auto" にしてみます。
デザイナからコントロールが消えます。。。
ん。。。まぁ、そうかも、しれない、ね。。。とりあえず、これでやってみよう。
無事、サイズの変更がわかりました。つまり、ブラウザのサイズ変更に object 要素が追従し、object 要素の変更に Silverlight アプリケーションも追従するようになりました。
しかし、これではデザインに支障が出ます。どうしましょう?手っ取り早いのは、オブジェクト生成の時に "Auto" を指定することですが、XAML には "Auto" と記述できますが(シリアル化解除で適切に変換してくれているのだろう)、Double に対して "Auto" という文字列は指定できません。困った。つらつら眺めていると、Height および Width の既定値は、0 ではなく Double.NaN です。
と書いてあります。これにしてみましょう。まず、Page.xaml の Width, Height に適当な数値を設定します。コンストラクタの InitializeComponent() 呼び出しの後、this.Width = double.NaN; と、this.Height = double.NaN; を追加します。そして実行。
うまくいきました。
やっぱり、読むならちゃんと読む。斜め読みはいかんね。。。
投稿日時 : 2008年12月12日 23:14