テーマ

用意されたテーマを適用することで、全体の外観を変更できます。

テーマの適用

既定のテーマはVisual Studioのバージョンに合わせて用意されており、たとえばVisual Studio 2015のそれはNuGet Gallery | DockPanelSuite.ThemeVS2015にあるようにNuGetからダウンロードできます。そしてDockPanelのThemeプロパティに

dockPanel.Theme = new WeifenLuo.WinFormsUI.Docking.VS2015BlueTheme();

のように指定することで適用できます。

なおテーマを指定しない場合には、Visual Studio 2005のそれが適用されます。Visual Studio 2005 Theme - Existing Themes — dockpanelsuite 3.0 documentation

v3.1.0以降は既定のテーマがDefaultThemeに変更されており、テーマを明示しないと「DockPanel.Theme must be set to a valid theme.」としてArgumentExceptionが投げられます。DockPanel showing content not working unless setting a theme · Issue #670 · dockpanelsuite/dockpanelsuite · GitHub

メニューなどへの適用

メニューなどのToolStripを継承したクラスもDockPanelのテーマに合わせるならば、適用するテーマのApplyTo()にそれを渡します。

ThemeBase themeBase = new VS2015BlueTheme();
themeBase.ApplyTo(menuStrip1);
themeBase.ApplyTo(statusStrip1);

dockPanel.Theme = themeBase;

もしくはVisualStudioToolStripExtenderで適用します。この方法ならば実行時に他のテーマに変更できます。

VisualStudioToolStripExtender toolStripExtender = new VisualStudioToolStripExtender();
toolStripExtender.DefaultRenderer = new ToolStripProfessionalRenderer();
toolStripExtender.SetStyle(menuStrip1, VisualStudioToolStripExtender.VsVersion.Vs2015, themeBase);

テーマの変更

テーマを適用するときはDockPanel上の区画はすべて閉じられている必要があるため、レイアウトを保存してからテーマを適用し、レイアウトを復元します。閉じずにThemeに設定すると、「Before applying themes all panes must be closed.」としてInvalidOperationExceptionが投げられます。

実際には閉じるは必要なく、DockPanel.Contents、DockPanel.Panes、DockPanel.FloatWindowsのすべてのコレクションの数が0であることが要求されます。

using (MemoryStream memoryStream = new MemoryStream())
{
    // レイアウトを保存する
    dockPanel.SaveAsXml(memoryStream, Encoding.UTF8);

    // すべてのコンテンツを閉じる
    CloseAllContents();

    // 新しいテーマを適用する
    dockPanel.Theme = newTheme;

    // レイアウトを復元する
    DeserializeDockContent deserializeDockContent = new DeserializeDockContent(GetDockContent);
    memoryStream.Seek(0, SeekOrigin.Begin);
    dockPanel.LoadFromXml(memoryStream, deserializeDockContent);
}
DockSample.MainForm.SetSchema()

ドッキング ウィンドウの親への参照は、次のようにすることですべて解放できます。

IDockContent[] contents = dockPanel.Contents.ToArray();
foreach (IDockContent form in contents)
{
    form.DockHandler.Hide(); // 非表示にする
    form.DockHandler.DockPanel = null;
}

FloatWindow[] windows = this.dockPanel.FloatWindows.ToArray();
foreach (FloatWindow window in windows)
{
    window.Dispose(); // Floatであるウィンドウの親への参照を解放する
}

すべてのコンテンツを非表示にせずにレイアウトを復元しようとすると、LoadFromXml()の呼び出しで「Invalid Content: ActiveContent must be one of the visible contents, or null if there is no visible content.」としてInvalidOperationExceptionが投げられます。ActiveContent must be one of the visible contents, or null if there is no visible content. · Issue #502 · dockpanelsuite/dockpanelsuite · GitHub

フォントの設定

フォントはTheme.Skinプロパティからアクセスできる、自動で隠れるウィンドウとそれ以外にそれぞれ設定できます。

// The skin used to display the auto hide strips and tabs.
dockPanel.Theme.Skin.AutoHideStripSkin.TextFont = newFont;

// The skin used to display the Document and ToolWindow style DockStrips and Tabs.
dockPanel.Theme.Skin.DockPaneStripSkin.TextFont = newFont;