Dragablz は、WPFアプリで使用できるドラッグ可能でタブを分離可能にするオープンソースライブラリです。Dragablz を使用することでとても簡単にドッキング可能なWindowsアプリケーションを作成可能です。使用ライセンスは当初「Ms-PL」でしたが、2016年に "MIT Licence" へ変更になったようです。
「Dragablz」 は、以下の方法で取得可能です。
下記より入手できます。
https://github.com/ButchersBoy/Dragablz
下記より入手できます。
https://www.nuget.org/packages/Dragablz/
まずは WPF で TabControl を使ったシンプルなプログラムを作ってみます。
これをリファレンスにして Dragablz
を使って少しずつ改造していきます。
[評価環境1]
| コンパイラ : | Visual Studio 2015 | |
| OS : | Windows 10 home, | バージョン1511(November Update) |
| ライブラリ : | Dragablz, | 0.0.3.160 |
[評価環境2]
| コンパイラ : | Visual Studio 2026, | 18.3.0 |
| OS : | Windows 11 Home, | 25H2 |
| ライブラリ : | Dragablz, | 0.0.3.234 |
ベースとなる WPF アプリの画面です。

このソースコード(xaml)です。
["MainWindow.xaml"]
<Window x:Class="Dragablz.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Dragablz"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<TabControl>
<TabItem Header="Tab No.1">
<Grid Background="#FFE5E5E5">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="Hello world." VerticalAlignment="Center"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.2">
<Grid Background="#FFE5E5E5">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="This is No.2 tab." VerticalAlignment="Center"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.3">
<Grid Background="#FFE5E5E5">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="Here we go !" VerticalAlignment="Center"/>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>
これを元に Dragablz を適用していきます。
最初に NuGet で Dragablz をインストールします。
ソースコードを以下のように修正します。色のついている3行(6, 11, 27 行目)を修正するだけです。
["MainWindow.xaml"]
<Window x:Class="Dragablz_step1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz"
xmlns:local="clr-namespace:Dragablz_step1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<dragablz:TabablzControl Margin="10">
<TabItem Header="Tab No.1">
<Grid Background="#FFE5E5E5">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="Hello world." VerticalAlignment="Center"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.2">
<Grid Background="#FFE5E5E5">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="This is No.2 tab." VerticalAlignment="Center"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.3">
<Grid Background="#FFE5E5E5">
<TextBlock HorizontalAlignment="Center" TextWrapping="Wrap" Text="Here we go !" VerticalAlignment="Center"/>
</Grid>
</TabItem>
</dragablz:TabablzControl>
</Grid>
</Window>
上記3行を修正するだけでタブをドラッグ移動可能になりました。
すばらしい!
ただし、Visual Studio の XML エディター および Blend 上で
<dragablz:TabablzControl> の子要素をマウス操作できなくなる、という課題がありました。
残念ながらそういうものらしく、簡単な解決策を現時点は見つけることができていません。
これについては少しずつ改善策を考えていきたいと思います。XAML を直接編集する、で良ければ全く問題ありません。
今度はタブを掴んでドラッグすることで、ウィンドウを分離できるようにします。

下記の3行(12-14行目)を追加するだけです。
["MainWindow.xaml"]
<Window x:Class="simpleWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz"
xmlns:local="clr-namespace:simpleWindow"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" ResizeMode="CanResizeWithGrip">
<Grid>
<dragablz:TabablzControl Margin="10">
<dragablz:TabablzControl.InterTabController>
<dragablz:InterTabController />
</dragablz:TabablzControl.InterTabController>
<TabItem Header="Tab No.1" Margin="0">
<Grid Background="#FFE5E5E5">
<TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Hello world." VerticalAlignment="Top"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.2" Margin="0">
<Grid Background="#FFE5E5E5">
<TextBlock x:Name="textBlock1" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="This is No.2 tab." VerticalAlignment="Top"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.3" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0">
<Grid Background="#FFE5E5E5">
<TextBlock x:Name="textBlock2" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Here we go !" VerticalAlignment="Top"/>
</Grid>
</TabItem>
</dragablz:TabablzControl>
</Grid>
</Window>
3行追加するだけで簡単に分離ウィンドウを作成できるようになりました。すばらしい。
続いて、タブ部分をドラッグ操作することで下図のようなレイアウト変更を行えるようにします。



ソースコードは以下の通りです。
黄色部分が追加したところです。水色部分はこれまでに既に追加した部分です。
"Partition" として指定しているキーワード(下記例では "Beginning")は何でもよいようですが、これが一致しているタブのみをレイアウトとして取り込めるようです。
["MainWindow.xaml"]
<Window x:Class="WithDragablz.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz"
xmlns:dockablz="clr-namespace:Dragablz.Dockablz;assembly=Dragablz"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WithDragablz"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<system:String x:Key="Partition">Beginning</system:String>
</Window.Resources>
<Grid>
<dockablz:Layout Partition="{StaticResource Partition}">
<dragablz:TabablzControl Margin="10" >
<dragablz:TabablzControl.InterTabController>
<dragablz:InterTabController Partition="{StaticResource Partition}"/>
</dragablz:TabablzControl.InterTabController>
<TabItem x:Name="tabItem01" Header="Tab No.1" Margin="0">
<Grid Background="#FFE5E5E5">
<TextBlock x:Name="textBlock0" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Hello world." VerticalAlignment="Top"/>
</Grid>
</TabItem>
<TabItem x:Name="tabItem02" Header="Tab No.2" Margin="0">
<Grid Background="#FFE5E5E5">
<TextBlock x:Name="textBlock1" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="This is No.2 tab." VerticalAlignment="Top"/>
</Grid>
</TabItem>
<TabItem Header="Tab No.3" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0">
<Grid Background="#FFE5E5E5">
<TextBlock x:Name="textBlock2" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Here we go !" VerticalAlignment="Top"/>
</Grid>
</TabItem>
</dragablz:TabablzControl>
</dockablz:Layout>
</Grid>
</Window>
こんなに簡単にできてしまいました。恐るべし、Dragablz !!
分離したタブを Close した時の挙動を設定するプロパティです。
固定タブ(ドラッグを許さず、またデフォルトの Close ボタンを表示しない)とするタブの数です。
この値は画面左側からのタブの数です。
この値はプログラム動作中に動的に変更可能です。
Allows a the first adjacent tabs to be fixed (no dragging, and default close button will not show).
Issue #18 に記載されているプロパティなのですが、Dragablz Ver. 0.0.3.165 のソース中にコードを確認できません。
Issue #18 に記載されているプロパティなのですが、Dragablz Ver. 0.0.3.165 のソース中にコードを確認できません。
["MainWindow.xaml"]
<Window x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dragablz="clr-namespace:Dragablz;assembly=Dragablz"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Dragablz;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<dragablz:TabablzControl ShowDefaultCloseButton="True"
ShowDefaultAddButton="True"
ItemContainerStyle="{StaticResource TrapezoidDragableTabItemStyle}"
AdjacentHeaderItemOffset="-10">
<TabItem Header="One">Content One</TabItem>
<TabItem Header="Two">Content Two</TabItem>
<TabItem Header="Three">Content Three</TabItem>
</dragablz:TabablzControl>
</Window>
本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。
| 2026-02-19 | - | 評価環境として VS2026 を追加 |
| デモ動画を3本追加 | ||
| 2025-06-09 | - | Dragablz のライセンスが "MIT Licence" へ変更になっていたことを追記 |
| 2022-10-10 | - | ページデザイン更新 |
| 2016-04-16 | - | 新規作成 |