Back to Devexpress

Dock Layout Manager: Performance Enhancements

wpf-401923-controls-and-libraries-layout-management-dock-windows-performance-enhancements.md

latest7.7 KB
Original Source

Dock Layout Manager: Performance Enhancements

  • Apr 23, 2025
  • 4 minutes to read

This topic contains recommendations that help improve DockLayoutManager performance.

Iterate Over Multiple Panels

The DockLayoutManager updates its layout after you perform the following operations:

  • Add or remove a Panel or a Group.
  • Close or hide a Panel or a Group.
  • Make a Panel or a Group floating.

When you perform multiple operations at once, wrap them with DockLayoutManager.BeginUpdate() and DockLayoutManager.EndUpdate() methods to reduce processing time. The DockLayoutManager updates its layout only after the last iteration.

csharp
public class ViewModel : ViewModelBase {
    public ICustomService DockLayoutManagerService { get { return this.GetService<ICustomService>(); } }

    // ...

    void AddNew() {
        DockLayoutManagerService.BeginUpdate();

        // perform multiple operations here

        DockLayoutManagerService.EndUpdate();
    }
}

Add Panels to DockItem

The code sample below creates Layout Panels and adds them to the LayoutGroup.

csharp
using DevExpress.Mvvm;
using System.Collections.ObjectModel;

// ...
public class ViewModel : ViewModelBase {
    public ICustomService DockLayoutManagerService { get { return this.GetService<ICustomService>(); } }

    public ObservableCollection<DataItem> Source {
        get { return GetValue<ObservableCollection<DataItem>>(); }
        set { SetValue(value); }
    }

    // ...

    void AddNew() {
        DockLayoutManagerService.BeginUpdate();
        for (int i = 0; i < 30; i++) {
            Source.Add(new DataItem() { Name = "Name" + i.ToString(), Value = i, TargetName = "host" });
        }
        DockLayoutManagerService.EndUpdate();
    }
}

DataItem.cs

csharp
using DevExpress.Mvvm;
using DevExpress.Xpf.Docking;

namespace DockingThreads {
    public class DataItem : BindableBase, IMVVMDockingProperties {
        public string Name {
            get { return GetValue<string>(); }
            set { SetValue(value); }
        }
        public int Value {
            get { return GetValue<int>(); }
            set { SetValue(value); }
        }
        public bool IsHidden {
            get { return GetValue<bool>(); }
            set { SetValue(value); }
        }

        public string TargetName { get; set; }

        public override string ToString() {
            return Name;
        }
    }
}

CustomService.cs

csharp
using DevExpress.Mvvm.UI;
using DevExpress.Xpf.Docking;

namespace DockingThreads
{

    public interface ICustomService {
        void BeginUpdate();
        void EndUpdate();
    }

    public class CustomService : ServiceBaseGeneric<DockLayoutManager>, ICustomService {
        public void BeginUpdate() {
            this.AssociatedObject.BeginUpdate();
        }
        public void EndUpdate() {
            this.AssociatedObject.EndUpdate();
        }
    }
}

Change the Panel Type to Autohidden

The code sample below creates Layout Groups and hides them on the left side of the application.

csharp
using DevExpress.Mvvm;

// ...

void HideAll() {
    DockLayoutManagerService.BeginUpdate();
    Source.ToList().ForEach(x => x.IsHidden = true);
    DockLayoutManagerService.EndUpdate();
}

DataItem.cs

csharp
using DevExpress.Mvvm;
using DevExpress.Xpf.Docking;

namespace DockingThreads {
    public class DataItem : BindableBase, IMVVMDockingProperties {
        public string Name {
            get { return GetValue<string>(); }
            set { SetValue(value); }
        }
        public int Value {
            get { return GetValue<int>(); }
            set { SetValue(value); }
        }
        public bool IsHidden {
            get { return GetValue<bool>(); }
            set { SetValue(value); }
        }

        public string TargetName { get; set; }

        public override string ToString() {
            return Name;
        }
    }
}

CustomService.cs

csharp
using DevExpress.Mvvm.UI;
using DevExpress.Xpf.Docking;

namespace DockingThreads
{

    public interface ICustomService {
        void BeginUpdate();
        void EndUpdate();
    }

    public class CustomService : ServiceBaseGeneric<DockLayoutManager>, ICustomService {
        public void BeginUpdate() {
            this.AssociatedObject.BeginUpdate();
        }
        public void EndUpdate() {
            this.AssociatedObject.EndUpdate();
        }
    }
}

Dock / Undock Operations

This section describes how to speed up dock, undock, and drag-and-drop operations.

Logical Layout Structure

When you dock/undock a panel, the visual tree of its child elements is rebuilt. To preserve the structure of the logical tree and increase the speed of dock/undock operations, set the DockLayoutManager.LogicalTreeStructure property to Optimized.

xaml
<dx:ThemedWindow ...
    xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking" 
    xmlns:dxcore="http://schemas.devexpress.com/winfx/2008/xaml/core">
    <Grid>
        <dxdo:DockLayoutManager LogicalTreeStructure="Optimized">
            <!-- ... -->
        </dxdo:DockLayoutManager>
    </Grid>
</dx:ThemedWindow>

Drag and Drop

Application performance decreases when you drag and drop a panel with complex content. To improve performance, disable the ShowContentWhenDragging option so that only the panel border is displayed during the drag-and-drop operation.

xaml
<dx:ThemedWindow ...
    xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking" 
    xmlns:dxcore="http://schemas.devexpress.com/winfx/2008/xaml/core">
    <Grid>
        <dxdo:DockLayoutManager ShowContentWhenDragging="False">
            <!-- ... -->
        </dxdo:DockLayoutManager>
    </Grid>
</dx:ThemedWindow>

Cache Tabs

Application performance decreases when you switch between DocumentGroup tabs with complex child items. Use the TabContentCacheMode property to cache opened tabs and improve DockLayoutManager performance.

xaml
<dx:ThemedWindow
    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" 
    xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking">
    <dxdo:DockLayoutManager>
        <dxdo:LayoutGroup>
            <dxdo:DocumentGroup TabContentCacheMode="CacheTabsOnSelecting">
                <dxdo:DocumentPanel Caption="Panel1">
                    <dxsample:UserControl1 />
                </dxdo:DocumentPanel>
                <dxdo:DocumentPanel Caption="Panel2">
                    <dxsample:UserControl1 />
                </dxdo:DocumentPanel>
            </dxdo:DocumentGroup>
        </dxdo:LayoutGroup>
    </dxdo:DockLayoutManager>
</dx:ThemedWindow>