public Dockable(string text) { //BorderStyle = BorderStyle.None; //Text = text; //BackgroundImage = SystemIcons.Error.ToBitmap(); //BackgroundImageLayout = ImageLayout.Stretch; DockControl = new DockControl(this, text) { TabText = text, TabIcon = System.Drawing.SystemIcons.Exclamation.ToBitmapSource() }; var label = Children.Add2(new Label { Content = "LABEL" }); DockControl.PaneChanged += (s, a) => { var pane = DockControl.DockPane; if (pane == null) { label.Content = "No Pane"; } else { label.Content = pane.LocationDesc(); } }; //Children.Add(new TextBox { Width = 140, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top }); //Children.Add(new TextBox { Width = 140, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top }); //Children.Add(new TextBox { Width = 140, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top }); }
/// <summary>Create a new dock container</summary> public DockContainer() { InitializeComponent(); Options = new OptionsData(); m_all_content = new HashSet <DockControl>(); ActiveContentManager = new ActiveContentManager(this); // The auto hide tab strips dock around the edge of the main dock container // but remain hidden unless there are auto hide panels with content. // The rest of the docking area is within 'centre' which contains the // root branch (filling the canvas) and four AutoHidePanels. // Add a Canvas for the centre area and add the root branch (filling the canvas) var centre = new Canvas { Name = "DockContainerCentre" }; // Create the auto hide panels AutoHidePanels = new AutoHidePanelCollection(this, centre); // Create a collection for floating windows FloatingWindows = new FloatingWindowCollection(this); // Add the centre content Children.Add2(centre); Root = centre.Children.Add2(new Branch(this, DockSizeData.Quarters)); Root.SetBinding(Branch.WidthProperty, new Binding(nameof(Canvas.ActualWidth)) { Source = centre }); Root.SetBinding(Branch.HeightProperty, new Binding(nameof(Canvas.ActualHeight)) { Source = centre }); // Ensure the default centre pane exists Root.PruneBranches(); ActivePane = (DockPane?)Root.Descendants[EDockSite.Centre].Item ?? throw new ArgumentNullException("Expected a DockPane"); // Create Commands CmdLoadLayout = Command.Create(this, CmdLoadLayoutInternal); CmdSaveLayout = Command.Create(this, CmdSaveLayoutInternal); CmdResetLayout = Command.Create(this, CmdResetLayoutInternal); }
// Notes: // - An auto hide panel is a panel that pops out from the edges of the dock container. // - It is basically a root branch with a single centre dock pane. The tab strip from the // dock pane is used for the auto-hide tab strip displayed around the edges of the control. // Other behaviours: // - Click pin on the pane only pins the active content // - Clicking a tab makes that dockable the active content // - 'Root' only uses the centre dock site public AutoHidePanel(DockContainer dc, EDockSite ds) { InitializeComponent(); Visibility = Visibility.Collapsed; Canvas.SetZIndex(this, 1); DockContainer = dc; DockSite = ds; PoppedOut = false; var splitter_size = 5.0; var splitter = new GridSplitter { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch, Background = SystemColors.ControlBrush, BorderBrush = new SolidColorBrush(Color.FromRgb(0xc0, 0xc0, 0xc0)), BorderThickness = DockSite.IsVertical() ? new Thickness(1, 0, 1, 0) : new Thickness(0, 1, 0, 1), }; // Create a grid to contain the root branch and the splitter switch (DockSite) { default: throw new Exception($"Auto hide panels cannot be docked to {ds}"); case EDockSite.Left: case EDockSite.Right: { // Vertical auto hide panel ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(DockSite == EDockSite.Left ? 1 : 2, GridUnitType.Star), MinWidth = 10 }); ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(0, GridUnitType.Auto) }); ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(DockSite == EDockSite.Right ? 1 : 2, GridUnitType.Star), MinWidth = 10 }); // Add the root branch to the appropriate column Root = Children.Add2(new Branch(dc, DockSizeData.Quarters)); Grid.SetColumn(Root, DockSite == EDockSite.Left ? 0 : 2); // Add the splitter to the centre column splitter.Width = splitter_size; Children.Add2(splitter); Grid.SetColumn(splitter, 1); break; } case EDockSite.Top: case EDockSite.Bottom: { // Horizontal auto hide panel RowDefinitions.Add(new RowDefinition { Height = new GridLength(DockSite == EDockSite.Top ? 1 : 2, GridUnitType.Star), MinHeight = 10 }); RowDefinitions.Add(new RowDefinition { Height = new GridLength(0, GridUnitType.Auto) }); RowDefinitions.Add(new RowDefinition { Height = new GridLength(DockSite == EDockSite.Bottom ? 1 : 2, GridUnitType.Star), MinHeight = 10 }); // Add the root branch to the appropriate row Root = Children.Add2(new Branch(dc, DockSizeData.Quarters)); Grid.SetRow(Root, DockSite == EDockSite.Top ? 0 : 2); // Add the splitter to the centre row splitter.Height = splitter_size; Children.Add2(splitter); Grid.SetRow(splitter, 1); break; } } // Remove the tab strip from the dock pane child so we can use // it as the auto hide tab strip for this auto hide panel TabStrip = DockPane.TabStrip; TabStrip.Detach(); TabStrip.AHPanel = this; }