泥庭

2014年5月28日

Client Sizeを指定してWindowを作成する

Filed under: .NET, WPF — タグ: , — yone64 @ 12:22 AM

Ribbonの記事が第3回目で止まって、早1か月が過ぎようとしていますが、今回もRibbonではなかったり。(決して忘れたわけでは…

で、ちょっと小ネタです。

要件

  • とあるコントロールをViewBoxで囲んでダイアログを表示する。
  • 初期の表示倍率は100%とする。

よくある(?)要件ですよね。特にImageとかでは、要求されることが多いのではないでしょうか?

実装

var w = new Window
{
    Content = new Viewbox
    {
        Child = control,
        Width = control.ActualWidth,
        Height = control.ActualHeight,
    },
    SizeToContent = SizeToContent.WidthAndHeight,
};
w.Loaded += (s, e2) =>
    {
        w.SizeToContent = SizeToContent.Manual;
        ((FrameworkElement)w.Content).Width = double.NaN;
        ((FrameworkElement)w.Content).Height = double.NaN;
    };
w.Show();

ポイント

WPFのWindowでは、WindowsFormsのClientSizeプロパティー相当のものがありません。その代りと言ってはアレですが、Contentプロパティーで指定されているコントロールのサイズをもとにWindowサイズを決定することができます。ただ、その場合Windowサイズを変更しても、Contentプロパティーで指定されたコントロールのサイズが追随しないので、サイズが決定された後にSizeToContentプロパティーと子要素のWidth/HeightをNaNに変更しています。

余談

そういえば、以前、SizeToContentとLoaded関係の不具合(?)っぽいものをBlogに投降したのを思い出し、修正されてるか確認してみました。

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

この記事を書いたときは、確か.NET 3.5だったんですが、4.5でも同じ現象が起きてるようですね。残念です。

1件のコメント »

  1. […] ひとつ前の記事、「Client Sizeを指定してWindowを作成する」の続きです。 […]

    ピンバック by アスペクト比を保ったままWindowの拡大縮小 | 泥庭 — 2014年5月31日 @ 2:36 PM


RSS feed for comments on this post. TrackBack URI

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

WordPress.com Blog.

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