泥庭

2011年10月5日

SizeToContentプロパティーとLoadedイベントの微妙な関係

Filed under: .NET, WPF — タグ: , — yone64 @ 11:46 PM

最近、WPFのバグっぽい動作の愚痴ばっかりです。

Windowクラスには、SizeToContentプロパティーがあります。概要については、MSDN参照。

SizeToContent の値が Manual 以外の場合 :

  • ユーザーがサイズ変更グリップを使用するか、境界線をドラッグしてウィンドウのサイズを変更すると、SizeToContent は自動的に Manual に設定されます。

  • コンテンツのサイズの変更により、ウィンドウのサイズ変更が必要になると、SizeChanged が発生します。

で、MSDNには記載されていませんがSizeToContentがManualかそれ以外かで、Loadedイベント発生時にWindowが表示されているかどうかが変わります。
SizeToContentがManualの場合はLoadedイベント発生時にはWindowが表示されているが、Manual以外の場合の場合は表示されません。

これが関係するかどうかはわかりませんが、SizeToContentがManual以外のWindowのLoadedイベントで、SizeToContentがManual以外に指定されたWindowを開いた場合、Windowサイズが正しく設定されません。

言葉にすると難しいので、サンプルソースを置いておきます。

https://skydrive.live.com/embedicon.aspx/.Public/SizeToContentSample.zip?cid=a46d108f79f66d2b&sc=documents

この現象の不思議ポイントは、WindowクラスのSize系プロパティーの値は変更されてSizeChangedイベントも発生しているのに、描画が更新されない点です。
ただし、WindowのTitleをクリックすると再描画がかかるらしく、サイズが大きくなります。

SizeToContentがManualの場合。
Loaded時点でWindow(SubWindow)が表示されており、Dialogに正しくSizeToContentが反映されている。
image

SizeToContentがWidthAndHeightの場合
Loaded時点ではWindow(SubWindow)が表示されておらず、Dialogのサイズが正しくない。

image

WindowのSizeChangedイベントでSendMessageを使いDialogにTitleバーのクリックメッセージを送ると正しく表示されるんですが、できれば避けたい回避方法です。
まぁ、そもそもLoadedイベントでWindowを表示するな。って話ですよね。

1件のコメント »

  1. […] SizeToContentプロパティーとLoadedイベントの微妙な関係 […]

    ピンバック by Client Sizeを指定してWindowを作成する | 泥庭 — 2014年5月28日 @ 12:27 AM


RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com で無料サイトやブログを作成.

%d人のブロガーが「いいね」をつけました。