Articles in this section
Category / Section

How to restrict the dockability of child window to client area in WPF DockingManager?

2 mins read

This article describes about how to restrict the docking abilities of the desired element, while trying to place the element in the Client area. If the element is dropped over the Client Area, the element is moved to its previous position in WPF DockingManager. The following code illustrate the same,

Mainwindow.xaml:

<syncfusion:DockingManager x:Name="dockingmanager">
  <syncfusion:DockingManager.ClientControl>
    <ContentControl Name="ClientArea" syncfusion:DockingManager.DesiredWidthInDockedMode="700" syncfusion:DockingManager.SideInDockedMode="Left"/>
  </syncfusion:DockingManager.ClientControl>
  <ContentControl x:Name="Media" syncfusion:DockingManager.Header="Dock1" syncfusion:DockingManager.SideInDockedMode= "Bottom" />
  <ContentControl x:Name="Timeline" syncfusion:DockingManager.Header="Dock2"  syncfusion:DockingManager.SideInDockedMode="Bottom" />
  <ContentControl syncfusion:DockingManager.Header="Dock3" syncfusion:DockingManager.DesiredWidthInDockedMode="300" syncfusion:DockingManager.SideInDockedMode="Right" Name="Properties"/>
  <ContentControl x:Name="playlist" syncfusion:DockingManager.Header="Dock4" syncfusion:DockingManager.DesiredWidthInDockedMode="240"  syncfusion:DockingManager.SideInDockedMode= "Tabbed" syncfusion:DockingManager.TargetNameInDockedMode="Properties" />            
</syncfusion:DockingManager>

Mainwindow.cs:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
    dockingmanager.PreviewMouseDown += Dockingmanager_PreviewMouseDown;
    dockingmanager.PreviewMouseUp += Dockingmanager_PreviewMouseUp;
    dockingmanager.PreviewMouseMove += Dockingmanager_PreviewMouseMove;            
  }       
       
  bool isMouseDown = false;
  bool isDragging = false;
  Point mouseDownPoint;
  Point mousePoint;
  DockedElementTabbedHost draggedelement = null;
  List<FrameworkElement> tabs = null;
  private void Dockingmanager_PreviewMouseUp(object sender, MouseButtonEventArgs e)
  {
    if (draggedelement != null && tabs != null)
    {
      foreach(var element in tabs)
      {
        if (DockingManager.GetDockAbility(element as FrameworkElement) == DockAbility.None)
          DockingManager.SetState(element as FrameworkElement, DockState.Dock);
          DockingManager.SetDockAbility(element as FrameworkElement, DockAbility.All);
      }                
    }
    isMouseDown = false;
    isDragging = false;                      
    tabs = null;
    draggedelement = null;
  }
 
  internal bool IsPointInsideElement(UIElement element)
  {
    Point pt = Mouse.GetPosition(element);
    Point point =  element.TranslatePoint(new Point(0, 0), this.dockingmanager);
    return pt.X > -5 && pt.Y > -5 && pt.X < point.X + element.RenderSize.Width && pt.Y < point.Y + element.RenderSize.Height;
  }
       
  private void Dockingmanager_PreviewMouseMove(object sender, MouseEventArgs e)
  {
    if (isMouseDown)
    {
      mousePoint = e.GetPosition(e.OriginalSource as IInputElement);
      draggedelement = VisualUtils.FindAncestor(dockingmanager.ActiveWindow, typeof(DockedElementTabbedHost)) as DockedElementTabbedHost;
 
      if (Math.Abs(mousePoint.X - mouseDownPoint.X) > 4 || Math.Abs(mousePoint.Y - mouseDownPoint.Y) > 4)
      {
        isDragging = true;
      }
      if (isDragging)
      {
        if (draggedelement != null && draggedelement.TabChildren != null && draggedelement.TabChildren.Count > 0)
        {
          tabs = new List<FrameworkElement>(draggedelement.TabChildren);
          if (tabs != null)
          {
            if (IsPointInsideElement(ClientArea))
            {                               
              foreach (var element in tabs)
              {
                DockingManager.SetDockAbility(element as FrameworkElement, DockAbility.None);
              }
            }
            else if (!IsPointInsideElement(ClientArea))
            {                                
              foreach (var element in tabs)
              {
                DockingManager.SetDockAbility(element as FrameworkElement, DockAbility.All);
              }
            }
          }
        }
      }
    }
  }
             
  private void Dockingmanager_PreviewMouseDown(object sender, MouseButtonEventArgs e)
  {
    isMouseDown = true;            
    mouseDownPoint = e.GetPosition(e.OriginalSource as IInputElement);
  }
}

View sample in GitHub.

Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments (0)
Please sign in to leave a comment
Access denied
Access denied