Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docfx/articles/dock-dockable-properties.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Dockable items such as documents, tools and docks implement the `IDockable` inte
| `CanFloat` | Controls if the item may be detached into a floating window. |
| `CanDrag` | Enables dragging the dockable to another position. |
| `CanDrop` | Determines if other dockables can be dropped onto this one. |
| `CanDockAsDocument` | Controls whether the dockable can be docked as a tabbed document. |
| `IsModified` | Marks a dockable as having unsaved changes. |
| `DockGroup` | Group identifier that restricts which dockables can dock together. See [Docking Groups](dock-docking-groups.md). |

Expand Down
7 changes: 7 additions & 0 deletions docfx/articles/dock-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,13 @@ you.
Dockables may still be floated programmatically unless their `CanFloat` property
is set to `false`.

To prevent a dockable from being docked into document docks (including the
"Dock as Tabbed Document" command), set `CanDockAsDocument` to `false`:

```csharp
tool.CanDockAsDocument = false;
```

**How can I prevent certain dockables from docking together?**

Use docking groups to control which dockables can dock together. Set the `DockGroup` property on your dockables:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
x:Class="Dock.Avalonia.Diagnostics.Controls.DockableDebugView"
x:DataType="core:IDockable"
x:CompileBindings="True">
<Grid RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto"
<Grid RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto"
ColumnDefinitions="Auto,*">
<TextBlock Text="Id" Grid.Row="0" Grid.Column="0" />
<TextBox Text="{Binding Id, Mode=TwoWay}" Margin="2" Grid.Row="0" Grid.Column="1" />
Expand Down Expand Up @@ -58,7 +58,9 @@
<CheckBox IsChecked="{Binding CanDrag, Mode=TwoWay}" Margin="2" Grid.Row="24" Grid.Column="1" />
<TextBlock Text="CanDrop" Grid.Row="25" Grid.Column="0" />
<CheckBox IsChecked="{Binding CanDrop, Mode=TwoWay}" Margin="2" Grid.Row="25" Grid.Column="1" />
<TextBlock Text="IsModified" Grid.Row="26" Grid.Column="0" />
<CheckBox IsChecked="{Binding IsModified, Mode=TwoWay}" Margin="2" Grid.Row="26" Grid.Column="1" />
<TextBlock Text="CanDockAsDocument" Grid.Row="26" Grid.Column="0" />
<CheckBox IsChecked="{Binding CanDockAsDocument, Mode=TwoWay}" Margin="2" Grid.Row="26" Grid.Column="1" />
<TextBlock Text="IsModified" Grid.Row="27" Grid.Column="0" />
<CheckBox IsChecked="{Binding IsModified, Mode=TwoWay}" Margin="2" Grid.Row="27" Grid.Column="1" />
</Grid>
</UserControl>
10 changes: 8 additions & 2 deletions src/Dock.Avalonia.Themes.Fluent/Controls/ToolChromeControl.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,14 @@
IsVisible="{Binding ActiveDockable.CanPin, FallbackValue=False}"/>
<MenuItem Header="{DynamicResource ToolChromeControlDockAsDocumentString}"
Command="{Binding Owner.Factory.DockAsDocument}"
CommandParameter="{Binding ActiveDockable}"
IsVisible="{Binding ActiveDockable.Owner, Converter={x:Static OwnerIsToolDockConverter.Instance}}"/>
CommandParameter="{Binding ActiveDockable}">
<MenuItem.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="ActiveDockable.CanDockAsDocument" FallbackValue="{x:False}" />
<Binding Path="ActiveDockable.Owner" Converter="{x:Static OwnerIsToolDockConverter.Instance}" />
</MultiBinding>
</MenuItem.IsVisible>
</MenuItem>
<MenuItem Header="{DynamicResource ToolChromeControlAutoHideString}"
Command="{Binding Owner.Factory.PinDockable}"
CommandParameter="{Binding ActiveDockable}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,14 @@
IsVisible="{Binding CanPin}"/>
<MenuItem Header="{DynamicResource ToolPinItemControlDockAsDocumentString}"
Command="{Binding Owner.Factory.DockAsDocument}"
CommandParameter="{Binding}"
IsVisible="{Binding Owner, Converter={x:Static converters:OwnerIsToolDockConverter.Instance}}"/>
CommandParameter="{Binding}">
<MenuItem.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="CanDockAsDocument" FallbackValue="{x:False}" />
<Binding Path="Owner" Converter="{x:Static converters:OwnerIsToolDockConverter.Instance}" />
</MultiBinding>
</MenuItem.IsVisible>
</MenuItem>
<MenuItem Header="{DynamicResource ToolPinItemControlCloseString}"
Command="{Binding Owner.Factory.CloseDockable}"
CommandParameter="{Binding}">
Expand Down
10 changes: 8 additions & 2 deletions src/Dock.Avalonia.Themes.Fluent/Controls/ToolTabStripItem.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,14 @@
IsVisible="{Binding CanPin, FallbackValue=False}" />
<MenuItem Header="{DynamicResource ToolTabStripItemDockAsDocumentString}"
Command="{Binding Owner.Factory.DockAsDocument}"
CommandParameter="{Binding}"
IsVisible="{Binding Owner, Converter={x:Static converters:OwnerIsToolDockConverter.Instance}}" />
CommandParameter="{Binding}">
<MenuItem.IsVisible>
<MultiBinding Converter="{x:Static BoolConverters.And}">
<Binding Path="CanDockAsDocument" FallbackValue="{x:False}" />
<Binding Path="Owner" Converter="{x:Static converters:OwnerIsToolDockConverter.Instance}" />
</MultiBinding>
</MenuItem.IsVisible>
</MenuItem>
<MenuItem Header="{DynamicResource ToolTabStripItemAutoHideString}"
Command="{Binding Owner.Factory.PinDockable}"
CommandParameter="{Binding }"
Expand Down
16 changes: 16 additions & 0 deletions src/Dock.Model.Avalonia/Core/DockableBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,12 @@ public abstract class DockableBase : ReactiveBase, IDockable, IDockSelectorInfo
public static readonly DirectProperty<DockableBase, bool> CanDropProperty =
AvaloniaProperty.RegisterDirect<DockableBase, bool>(nameof(CanDrop), o => o.CanDrop, (o, v) => o.CanDrop = v);

/// <summary>
/// Defines the <see cref="CanDockAsDocument"/> property.
/// </summary>
public static readonly DirectProperty<DockableBase, bool> CanDockAsDocumentProperty =
AvaloniaProperty.RegisterDirect<DockableBase, bool>(nameof(CanDockAsDocument), o => o.CanDockAsDocument, (o, v) => o.CanDockAsDocument = v);

/// <summary>
/// Defines the <see cref="IsModified"/> property.
/// </summary>
Expand Down Expand Up @@ -228,6 +234,7 @@ public abstract class DockableBase : ReactiveBase, IDockable, IDockSelectorInfo
private bool _canFloat = true;
private bool _canDrag = true;
private bool _canDrop = true;
private bool _canDockAsDocument = true;
private double _minWidth = double.NaN;
private double _maxWidth = double.NaN;
private double _minHeight = double.NaN;
Expand Down Expand Up @@ -481,6 +488,15 @@ public bool CanDrop
set => SetAndRaise(CanDropProperty, ref _canDrop, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
[JsonPropertyName("CanDockAsDocument")]
public bool CanDockAsDocument
{
get => _canDockAsDocument;
set => SetAndRaise(CanDockAsDocumentProperty, ref _canDockAsDocument, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
[JsonPropertyName("IsModified")]
Expand Down
23 changes: 23 additions & 0 deletions src/Dock.Model.Avalonia/Json/AvaloniaDockSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(IDocument)] = new List<string>
{
Expand All @@ -78,6 +79,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(IDocumentContent)] = new List<string>
{
Expand All @@ -93,6 +95,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(ITool)] = new List<string>
{
Expand All @@ -108,6 +111,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(IToolContent)] = new List<string>
{
Expand All @@ -123,6 +127,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(IDock)] = new List<string>
{
Expand All @@ -138,6 +143,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand All @@ -164,6 +170,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -192,6 +199,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -220,6 +228,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand All @@ -246,6 +255,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -274,6 +284,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand All @@ -300,6 +311,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -335,6 +347,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -366,6 +379,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(DockBase)] = new List<string>
{
Expand All @@ -381,6 +395,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand All @@ -407,6 +422,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(Tool)] = new List<string>
{
Expand All @@ -422,6 +438,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
},
[typeof(DockDock)] = new List<string>
{
Expand All @@ -437,6 +454,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -465,6 +483,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -493,6 +512,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -521,6 +541,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand All @@ -546,6 +567,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down Expand Up @@ -581,6 +603,7 @@ public AvaloniaDockSerializer()
"CanFloat",
"CanDrag",
"CanDrop",
"CanDockAsDocument",
// IDock
"VisibleDockables",
"ActiveDockable",
Expand Down
9 changes: 9 additions & 0 deletions src/Dock.Model.CaliburMicro/Core/DockableBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public abstract class DockableBase : CaliburMicroBase, IDockable, IDockSelectorI
private bool _canFloat = true;
private bool _canDrag = true;
private bool _canDrop = true;
private bool _canDockAsDocument = true;
private bool _isModified;
private string? _dockGroup;
private bool _showInSelector = true;
Expand Down Expand Up @@ -259,6 +260,14 @@ public bool CanDrop
set => Set(ref _canDrop, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
public bool CanDockAsDocument
{
get => _canDockAsDocument;
set => Set(ref _canDockAsDocument, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
public bool IsModified
Expand Down
9 changes: 9 additions & 0 deletions src/Dock.Model.Inpc/Core/DockableBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public abstract class DockableBase : ReactiveBase, IDockable, IDockSelectorInfo
private bool _canFloat = true;
private bool _canDrag = true;
private bool _canDrop = true;
private bool _canDockAsDocument = true;
private double _minWidth = double.NaN;
private double _maxWidth = double.NaN;
private double _minHeight = double.NaN;
Expand Down Expand Up @@ -260,6 +261,14 @@ public bool CanDrop
set => SetProperty(ref _canDrop, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
public bool CanDockAsDocument
{
get => _canDockAsDocument;
set => SetProperty(ref _canDockAsDocument, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
public bool IsModified
Expand Down
9 changes: 9 additions & 0 deletions src/Dock.Model.Mvvm/Core/DockableBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public abstract class DockableBase : ReactiveBase, IDockable, IDockSelectorInfo
private bool _canFloat = true;
private bool _canDrag = true;
private bool _canDrop = true;
private bool _canDockAsDocument = true;
private double _minWidth = double.NaN;
private double _maxWidth = double.NaN;
private double _minHeight = double.NaN;
Expand Down Expand Up @@ -260,6 +261,14 @@ public bool CanDrop
set => SetProperty(ref _canDrop, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
public bool CanDockAsDocument
{
get => _canDockAsDocument;
set => SetProperty(ref _canDockAsDocument, value);
}

/// <inheritdoc/>
[DataMember(IsRequired = false, EmitDefaultValue = true)]
public bool IsModified
Expand Down
Loading