Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disable drop targets (layouts) in Avalondock

Tags:

c#

wpf

avalondock

I am using the open source library AvalonDock to support drag and drop of multiple tabs (panes) outside and back to the MainWindow and I want to disable most of the possible drop targets (or lets say layouts) like placing a tab below another or placing tabs side by side. In other words I only want to allow placing tabs in a "row of tabs" like in firefox or chrome browser.

Is there any property to disable drop targets (layouts) and if yes, can you please provide me with a short code example?

Here is a simple example of an MainWindow with three dockable panes (LayoutDocuments), which look like the TabItems of the standard TabControl of WPF (sorry, I could not post a screenshot of this):

<Window x:Class="TabTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
        Height="300" Width="300">
    <Grid>
        <xcad:DockingManager VerticalAlignment="Stretch">
            <xcad:LayoutRoot>
                <xcad:LayoutPanel>
                    <xcad:LayoutDocumentPane>
                        <xcad:LayoutDocument Title="Doc1">
                        </xcad:LayoutDocument>
                        <xcad:LayoutDocument Title="Doc2">
                        </xcad:LayoutDocument>
                        <xcad:LayoutDocument Title="Doc3">
                        </xcad:LayoutDocument>
                    </xcad:LayoutDocumentPane>
                </xcad:LayoutPanel>
            </xcad:LayoutRoot>
        </xcad:DockingManager>
    </Grid>
</Window>

Thanks for your help!

like image 704
Hubaaa Avatar asked Nov 12 '22 17:11

Hubaaa


1 Answers

This answer is written for AvalonDock 2.0. I don't know if this works on other versions of AvalonDock.

In the source code, there is a file Controls/OverlayWindow.cs. Change the code inside the else inside the case DropAreaType.DocumentPane: default: to hide the desired targets no matter what:

void IOverlayWindow.DragEnter(IDropArea area)
{
    ...
    switch (area.Type)
    {
        ...
        case DropAreaType.DocumentPane:
        default:
            {
                ...
                else
                {
                    areaElement = _gridDocumentPaneDropTargets;

                    _documentPaneDropTargetLeft.Visibility = Visibility.Hidden;
                    _documentPaneDropTargetRight.Visibility = Visibility.Hidden;
                    _documentPaneDropTargetTop.Visibility = Visibility.Hidden;
                    _documentPaneDropTargetBottom.Visibility = Visibility.Hidden;

                    /* ... */
                }
            }
        break;
    }
    ...
}

The ellipses are to summaries code segments.

like image 164
oddRaven Avatar answered Dec 20 '22 09:12

oddRaven