スポンサーサイト

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

DockPanel Suiteについてのメモ

いくつか調べたり試したりしたことの覚え書き。

・ドッキングを記録したXMLファイルを再起動なしで復元する方法(DockContentのDockPanelの解放)
>You can copy the dockPanel.Contents collection to an array, and iterate through the array instead of the original collection; or use the indexer instead of the iterator:
for (int i=DockStation.Count - 1; i>=0; i--)
DockSation[i].DockPanel = null;

http://sourceforge.net/p/dockpanelsuite/discussion/402316/thread/bdd34064/#dc5d/2a9a/33ca
DockPanel Suite:Saving the current layout and restoring
http://sourceforge.net/p/dockpanelsuite/discussion/402316/thread/bdd34064/

素直にforeach(DockContent x in dockPanel.Contents) x.DockPanel = nullとすると、途中でコレクションが変わってforeachが回せなくなるので一度別のコレクションにコピーするのを推奨っぽい。

・DockWindowを閉じたあとにオブジェクトをDisposeしない
DockContent側でHideOnCloseをtrue

・ドッキングのネスト
(↓こういうことをしたい)
2014-12-07 123234

こうする(Form2はDockContentを継承しているものとして)
f21 = new Form2();
f22 = new Form2();

f21.Show(dockPanel1, DockState.DockLeft);
f22.Show(f21.Pane, DockAlignment.Bottom, 0.5);
ネストするフォームのPane(Panelではない)に対してドッキングを指定するのがポイント。proportionは相対指定で1以上を指定すると1とみなされる(ここでは絶対指定はできない?)模様。dockPane.SetNestedDockingProportionも同様。

・ドッキングの幅や高さの絶対指定
>Set the value of DockPanel.DockLeftPortion/DockRightPortion/DockTopPortion/DockBottomPortion property. If the value < 1, it will be considered as percentage; otherwise it will be a fixed value in pixels.
http://sourceforge.net/p/dockpanelsuite/discussion/402316/thread/b02e0315/#6046/b23b/36b6
DockPanel Suite:How to fix DockWindow Size
http://sourceforge.net/p/dockpanelsuite/discussion/402316/thread/b02e0315/

dockPanel.DockLeftPortion 等で1.0未満なら相対指定、これより上なら絶対指定になる。dockPaneに対する絶対指定はない模様?

探したらdockPaneに対して絶対指定する方法がありました。
https://github.com/dockpanelsuite/dockpanelsuite/issues/97

ただDockPanel Suiteのソースを書き換えているようなので、ネストする場所をdockPanel側のPortionで絶対指定して固定するか、SizeChangedのイベントで処理するのが簡単そう?

SizeChangedイベントを使った例
dockPanel.DockがFillで、DockLeftの縦幅を固定し、フォームのサイズ変更に合わせてDockBottomの縦幅を変える場合
void Form1_SizeChanged(object sender, EventArgs e)
{
//DockLeftの縦幅を200pxに固定する
int fixedpixel = 200;
//DockBottonのPortionの計算
double bottom_portion = System.Math.Max((double)(this.ClientSize.Height - fixedpixel) / (double)this.ClientSize.Height, 0.0);
//Portionの指定
dockPanel1.DockBottomPortion = bottom_portion;
}


ただ、DockBottom側のタイトルバーが残ることがあるので完全にはいかない模様。


・ドッキングされているアイテムのフォーカスの変更
f22のフォームにフォーカスを変更する場合の例:

Form2 f21, f22;

private void button1_Click(object sender, EventArgs e)
{
foreach(IDockContent content in dockPanel1.Contents)
{
if(content.DockHandler.Form == f22)
{
content.DockHandler.Activate();
}
}
}


・タイトルバーの色の変更
dockPanelのSkin以下のパラメーターを変更(デザイナーから可能)。グラデーションも可能。本家(http://sourceforge.net/projects/dockpanelsuite/)ではなく、最新のGithub版(https://github.com/dockpanelsuite/dockpanelsuite/tree/development_3.0)だとフォントも変更できるらしい。仕様が変わってSkinではなくThemeで設定しないと怒られるとか。

DLLを自分でビルドして使う場合(GitHub版の改変)
既存で用意されているVS2012LightThemeの非アクティブのタブの色を変えてみます。先ほどのソースをダウンロードしてきて、VS2012LightTheme.csを開き、次のように変更します。
2014-12-13 210440
(本来のソースはコメントアウトさせています)
これでビルドして出てきたDLLを、使いたいプロジェクトの参照から読ませればOK。参照元をリビルドしたときに参照先のDLLの内容が変わっていても適宜DLLをコピーして反映されるようです。この結果はこちら↓
20141213 210804
当たり前だけど元のソースをいじればいくらでもカスタムドローできますよってことです。

ところが、このGitHub版のver3.0.0では、本家のSkinプロパティで設定している内容を新しく実装したThemeプロパティに置き換えようとしているようで、参照元でSkinプロパティにアクセスしていると、デバッグ画面でいちいち警告が出てきてぶっちゃけうざいのです(ビルド自体は通ります)。DockPanelをデザイナー経由で配置するとSkinへの代入操作が入り、デザイナーで生成されたコードのほうでSkinプロパティにアクセスしているため、デバッグの警告が消えません。DockPanelの配置をデザイナーでやらずフォーム側書きスキンをThemeのみに代入すると、当然ながら警告は出ません。

・Ver3.0.0でDocument以外のツールウィンドウでアイコンを表示したり、ツールウィンドウのタブのサイズを変更する
本家ではツールウィンドウでもアイコンが表示されていましたが、Ver3.0.0では次のようになっています

・DockState = Documentの場合、dockPanel.ShowDocumentIconがtrueとするとアイコンが表示される
・DockState = それ以外の場合、アイコンは一切表示されない

これを本家と同じようにツールウィンドウでもアイコンを表示したい場合は、VS2012LightDockPaneStrip.cs(VS2012Lightのテーマを書き換える場合)の定数を、
> private const int _ToolWindowImageHeight = 16;
> private const int _ToolWindowImageWidth = 0;

       private const int _ToolWindowImageHeight = 16;
private const int _ToolWindowImageWidth = 16;

とします。Width=0でアイコンを表示しないように変更されていたようです。フォントサイズが小さい場合、アイコンがなくなったせいでツールウィンドウが本家よりもさらにクリックしづらくなっているので、クリックしやすいようにタブを大きくする場合は、Width=0を保ったままでHeightの値を変更するとタブの縦幅が大きくなります。
 タブの横幅のみ大きくしたい場合は、同じファイルの
        private const int _ToolWindowTextGapRight = 3;

の値を書き換えるとタブが横方向に拡張されます。
 AutoHideについてもVS2012LightAutoHideStrip.csの定数を同様に書き換えることで変更できます。

・Ver3.0.0でAutoHideのストリップの色を変える
タブの幅のときと同様に、VS2012LightDockPaneStrip.csの
2014-12-14 015656
このメソッドの部分で指定します。この色は本家も同じ仕様なのか別立てのプロパティや変数で指定しているコードがなく、OnPaintのブラシの色を参照しているためわかりづらいです。そしてこうなります↓
2014-12-14 015739
選択時のタブ名の左にある線や文字の色は、DockPanel.Skin以下のAutoHideStripSkin.DockStripGradient.StartColorとEndColorで変更可能(これもライブラリの外から設定すると怒られるので、タイトルバーの色と同様VS2012LightTheme.cs内のCreateVisualStudio2012Lightに追加するのが良い?)。


(調べたら順次追加します)
スポンサーサイト
プロフィール

こしあん

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

Twitter
カウンター
天気予報

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