スポンサーサイト

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

DockPanel Suiteのウィンドウの順序でハマってアヘ顔ダブルピースになった話

例えば、DockLeft に複数のウィンドウをネストしてドッキングしていたとします。

-------Dock Left-------
 【ウィンドウA】
 【ウィンドウB】
 【ウィンドウC】
----------------------
こんな感じに(図1)

では、DockLeftにネストして格納されているDockContentの一覧を取得するにはどうしたらいいかというと、まずパッと考えて次のような方法が思い浮かびます。

 
var left = dockPanel1.Contents.Where(k => k.DockHandler.DockState == DockState.DockLeft)
.Select(k => k.DockHandler);

【方法1】

たしかにこれは起動直後はうまくいくのですが、ユーザーがドッキングをいじってるうちにうまく行かなくなります(ハマります)。なぜかというと、ユーザーが

-------Dock Left-------
 【ウィンドウB】
 【ウィンドウC】
 【ウィンドウA】
----------------------
(図2)

のようにドッキングの順序関係を変更したとしましょう。このとき、【方法1】のやり方では、DockContentが初期化の際に格納した順になっているので、A→B→Cの順番のままなのです。これをちゃんとB→C→Aの順番で取得するには次のようにします(相当ややこしいです)。


var left = dockPanel1.DockWindows.Where(k => k.DockState == DockState.DockLeft).First()//--(1)
.NestedPanes.Select(k => k.Contents.First())//--(2)
.Where(k => k.DockHandler.Content is SomeClass //--(3)
&& k.DockHandler.DockState == DockState.DockLeft)//--(4)
.Select(k => k.DockHandler);

【方法2】

<解説>
(1) dockPanelにはドッキングの箇所(左、上、右、下、中央)に応じてそれぞれのウィンドウがあるので、左(DockStateで識別可能)のウィンドウを取得します

(2)左のウィンドウに対して、ネストされているウィンドウのPaneを選択し(これがウィンドウA、ウィンドウB、ウィンドウCに対応します)、Paneの中のDockContentの最初(複数ある場合は同じPaneの中でタブ表示等している場合で、大きさの取得する場合は最初のContentだけでOK)を取得します。
DockContentは対応する表示領域のPaneを持っていますが、ある程度突っ込んだことをしようとすると、ContentからPaneを取得するのではなく、PaneからContentを取得するということがたびたびあります。

(3)ただし、NestedPanesからDockContentを取得する場合は、なぜか1個だけ余分なContentがあります。おそらく、何も表示されていない領域の背景に対応するDockContentをライブラリ側が勝手に突っ込んでいるんじゃないかと。ユーザーが突っ込んだウィンドウも、ライブラリが勝手に入れた領域もどっちもDockContentなので、ユーザーのウィンドウを独自の型やインターフェイスにキャストできないと識別が難しいことになります…。

(4) AutoHideに対応するContentを除外します(この場合はDockLeftAutoHide)

・独自の型について、
基準となる型やインターフェイスを作ればいいので、次のように継承関係にするのがいいかと。

【ベースとなるクラスを作る場合】
DockContent → 何らかのベース → ウィンドウA
                       →ウィンドウB
                       →ウィンドウC …
→継承関係

【インターフェイスの場合】
DockContent → ウィンドウA(インターフェイスXを実装)
         → ウィンドウB(インターフェイスXを実装)
         → ウィンドウC(インターフェイスXを実装)

インターフェイスにしちゃうと、共通のメソッドやプロパティを入れた時に実装記述しないと行けないんでちとめんどい。できればベースのクラスを作ったほうが楽だけど、作ってから気づいた場合だとそういうのはなかなか作りにくい。あーもうめんどくさい><

ドッキングウィンドウなんて大っ嫌い!
スポンサーサイト
プロフィール

こしあん

Author:こしあん
(:3[____]
【TwitterID : koshian2】
【ほしい物リスト】http://goo.gl/bDtvG2

Twitter
カウンター
天気予報

-天気予報コム- -FC2-
カテゴリ
月別アーカイブ
最新記事
最新トラックバック
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。