気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
以前の記事で、SilverlightでActualHeightやActualHeightを取得する方法を紹介しました。
Silverlightで発生するActualHeightやActualWidthを取得できない現象は同じくWPFでも発生します。

対処方法や考え方はSilverlightと同じなのですが、コードレベルでは少し異なる部分もあるので、
あらためて記事にしたいと思います。

まず、この現象が発生する原因については、Silverlight版の記事を参照してください。

以下は現在私が開発しているソフトのMainWindowのコンストラクタです。
InitializeComponent()でコントロールが初期化された後に各コンポーネントのサイズを
調整する処理を記述しています。

        public MainWindow()
        {
            InitializeComponent();

            //遅延処理を行う
            Dispatcher.BeginInvoke(new Action(() =>
                {
                    //DockPanelのサイズを設定する
                    _rootPanel.Width = _rootCanvas.ActualWidth;
                    _rootPanel.Height = _rootCanvas.ActualHeight;

                    //ブラウザコントロールのサイズを設定する
                    _browser.Height = _rootCanvas.ActualHeight / 2;
                })
            ,DispatcherPriority.Loaded);
        }

Silverlight版と異なる点が2つあります。

1つ目は、BeginInvokeの第一引数の記述方法です。汎用デリゲートActionのコンストラクタにラムダ式の匿名メソッドを
指定して初期化しています。Silverlight版では、第一引数に直接匿名メソッドを記述するだけでもOKでした。

2つ目は、DispatcherPriorityを指定している点です。Silverlight版のBeginInvoke()では、DispatcherPriorityは指定
することが出来ませんでした。WPFでは逆にこれを正しく指定しないとActualHeightやActualWidthを取得することが出来ません。

レイアウトシステムの処理は指定できる優先順位の中で3つ目に高いRenderが割り当てられています。
そのため、Actualサイズを取得する処理にはこれより低い優先順位を指定しないといけません。

以上です。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/72-3610b55f

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。