To reproduce: - add a dock with ToolWindow and DocumentWindow - set the following properties: ToolWindow1.TabStrip.SizeInfo.SizeMode = Telerik.WinControls.UI.Docking.SplitPanelSizeMode.Absolute ToolWindow1.TabStrip.MaximumSize = New Size(94, 400) ToolWindow1.TabStrip.SizeInfo.AbsoluteSize = New Size(94, 400) ToolWindow1.DefaultFloatingSize = New Size(94, 400) - Run the app, change the ToolWindow DockState to floating from context menu in the ToolWindow caption - re-dock the ToolWindow => its sizi is not 94,400 and its SizeMode and AbsoluteSize properties have different values If you perform the same scenario, but make the ToolWindow floating with drag and drop not with the context menu, everything works fine correctly. WORKAROUND: Private Sub RadDock1_DockStateChanging(sender As Object, e As Telerik.WinControls.UI.Docking.DockStateChangingEventArgs) If e.NewWindow Is ToolWindow1 AndAlso e.NewDockState = Telerik.WinControls.UI.Docking.DockState.Docked Then e.NewWindow.TabStrip.SizeInfo.SizeMode = Telerik.WinControls.UI.Docking.SplitPanelSizeMode.Absolute e.NewWindow.TabStrip.MaximumSize = New Size(94, 400) e.NewWindow.TabStrip.SizeInfo.AbsoluteSize = New Size(94, 400) e.NewWindow.DefaultFloatingSize = New Size(94, 400) End If End Sub
To reproduce: Add a ToolWindow to RadDock. AutoHide it: toolWindow1.AutoHide(); Then Hide it: toolWindow1.Hide(); And show it: toolWindow1.Show(); You will see that the window is docked but is not AutoHide Workaround: Call the AutoHide method instead of the Show method: toolWindow1.AutoHide();
To reproduce: Add a few ToolWindows to RadDock and start the application. Drag one window out of the form and dock the others inside of it. Dock the window back to the RadDock. You will notice that only the current window will be docked leaving the rest of the windows floating. The correct behavior is the whole window with its child windows to be docked. Workaround: Subscribe to the DockStateChanging and DockStateChanged events and manually add the windows. private IEnumerable<DockWindow> windows; void RadDock_DockStateChanging(object sender, DockStateChangingEventArgs e) { if (e.NewWindow.FloatingParent == null) { this.windows = Enumerable.Empty<DockWindow>(); return; } this.windows = DockHelper.GetDockWindows(e.NewWindow.FloatingParent, true, this.RadDock).Where(x => x != e.NewWindow); } void RadDock_DockStateChanged(object sender, DockWindowEventArgs e) { foreach (DockWindow window in windows) { this.RadDock.DockWindow(window, e.DockWindow.DockTabStrip, DockPosition.Fill); } }
If we set the AutoHideSize of a ToolWindow to the RadDock size, upon opening the AutoHide window we will notice that there is a gap of about 20px between the edge of RadDock and the AutoHide window.
I put a tree on toolwindow (the tree Nodes are chekbox) , when I autohide the toolwindow and show it again the font of tree nodes change and also the nodes which were checked change to uncheck
To reproduce: -add a RadDock with a ToolWindow -add some controls inside the ToolWindow and anchor them to Left, Bottom, Right -use RadDock Advanced layout designer to set the ToolWindow as unpinned. -run the project and notice that when showing the ToolWindow its child controls are not positioned correctly (compared to at design time). Workaround: use RadPanel docked to the ToolWindow as parent container and position all anchored controls inside it
To reproduce: Add a RadDock and a DockWindow, AutoHide it, add a RadPropertyGrid to its controls and dock it. Set the SelectedObject of the property grid to the current form and start the application. Edit the BackColor value and you will notice that the window will hide.
Issue wirh loading layout from xml related to disposing mechanism in RadDock
Hidden HostWindows are not loaded correctly when the load operation is performed twice.
1. Create a new project with RadDock and add 5 tool windows. 2. Dock all tool windows to bottom. 3. Reset the order of the tool windows to not be 1-5 4. Set the group to auto-hide 5. Save dashboard layout 6. Load dashboard layout
DECLINED: the issue is in the client's code. To reproduce: - add a dock with some windows - save the layout with this code: var stringWriter = new StringWriter(); radDock1.SaveToXml(stringWriter); savedLayoutString = stringWriter.ToString(); //with this line you can save the same stream to a file and observe that it is saved with UTF-16 - load the layout with the following code: using (var stream = new MemoryStream()) { var streamWriter = new StreamWriter(stream); streamWriter.Write(savedLayoutString); streamWriter.Flush(); stream.Position = 0; radDock1.LoadFromXml(stream); } Workaround - when reading the xml, replace utf-16 with utf-8 streamWriter.Write(File.ReadAllText("qqq.xml").Replace("utf-16", "utf-8"));
To reproduce: Me.RadDock1.DocumentTabsAlignment = Telerik.WinControls.UI.TabStripAlignment.Left Me.RadDock1.DocumentTabsTextOrientation = Telerik.WinControls.UI.TabStripTextOrientation.Vertical Please refer to the attached file. Workaround: Me.RadDock1.DocumentTabsAlignment = Telerik.WinControls.UI.TabStripAlignment.Left Me.RadDock1.DocumentTabsTextOrientation = Telerik.WinControls.UI.TabStripTextOrientation.Vertical For Each d As DocumentWindow In Me.RadDock1.DockWindows.DocumentWindows d.TabStripItem.AngleTransform = 180 Next Or: foreach (DocumentWindow d in this.radDock1.DockWindows.DocumentWindows) { d.TabStripItem.FlipText = true ; }
To reproduce: 1. Add several DocumentWindows and ToolWindows to the RadDock. 2. Add RadButton controls to the available windows. 3. Subscribe to the ActiveWindowChanged event. 4. Run the application and click over the strip item of one ToolWindow. As a result the ActiveWindowChanged event is fired. Click over the RadButton for a DocumentWindow. You will notice that the ActiveWindowChanged event is not fired. Note: When the active DocumentWindow contains controls ,e.g. RadButton, the tab strip item is not bold. Workaround: static RadDock dock; public Form1() { InitializeComponent(); dock = this.radDock1; Application.AddMessageFilter(new MyFilterClass()); } public const int WM_LBUTTONDOWN = 0x0201; public class MyFilterClass : IMessageFilter { public bool PreFilterMessage(ref Message m) { if (m.Msg == WM_LBUTTONDOWN) { Point pt = dock.PointToClient(Cursor.Position); var clickedElement = dock.GetChildAtPoint(pt, GetChildAtPointSkip.Invisible) ; while (!(clickedElement is ToolWindow || clickedElement is DocumentWindow) && clickedElement != null) { ToolTabStrip tabStrip = clickedElement as ToolTabStrip; if (tabStrip != null) { clickedElement = tabStrip.ActiveWindow; } else { clickedElement = clickedElement.GetChildAtPoint(pt, GetChildAtPointSkip.Invisible); } } if (clickedElement != null) { dock.ActiveWindow = clickedElement as DockWindow; } } return false; } } private void radDock1_ActiveWindowChanged(object sender, Telerik.WinControls.UI.Docking.DockWindowEventArgs e) { e.DockWindow.TabStripItem.Font = new Font(e.DockWindow.TabStripItem.Font, FontStyle.Bold); foreach (DocumentWindow dw in this.radDock1.DockWindows.DocumentWindows) { if (dw.Name != e.DockWindow.Name) { dw.TabStripItem.Font = new Font(e.DockWindow.TabStripItem.Font, FontStyle.Regular); } } }
To reproduce : 1. Add three DocumentWindows. 2. Dock one of the windows to the top of the container. 3. The ActiveWindowChanged event is fired but the window is not marked as active. Clicking on this window does not take affect and it is still not activated. Please refer to the attached gif file. Workaround: public Form1() { InitializeComponent(); this.radDock1.ActiveWindowChanged += radDock1_ActiveWindowChanged; this.radDock1.DockStateChanged += radDock1_DockStateChanged; } private void radDock1_ActiveWindowChanged(object sender, Telerik.WinControls.UI.Docking.DockWindowEventArgs e) { UpdateSelectedFont(e); } private void radDock1_DockStateChanged(object sender, Telerik.WinControls.UI.Docking.DockWindowEventArgs e) { if (e.DockWindow.DockState == Telerik.WinControls.UI.Docking.DockState.Docked) { UpdateSelectedFont(e); } } private void UpdateSelectedFont(DockWindowEventArgs e) { foreach (DockWindow dw in this.radDock1.DockWindows.DocumentWindows) { if (dw.TabStripItem.Text == e.DockWindow.TabStripItem.Text) { dw.TabStripItem.Font = new Font(dw.TabStripItem.Font, FontStyle.Bold); } else { dw.TabStripItem.Font = new Font(dw.TabStripItem.Font, FontStyle.Regular); } } }
To reproduce: - Add RadDock with some document windows to a blank form. - Make one widow floating and then remove the dock from the current form Controls collection on a button click.
To reproduce: Use the BugTracker project from the {IntallationFolder}\Examples\BugTracker 1. Change the CloseAction for all DocumentWindows to "Hide". 2. Run the application. 3. Close tab "Bugs" 4. Save the layout, pressing the "Save" button ribbon tab "view" 5. Load the layout. You will notice that the "Bugs" tab is visible but in a invalid state. Workaround: use DocumentWindow.CloseAction = Close or call DocumentWindow.Show method before loading the layout.
These are the steps to reproduce the bug: 1. Start dragging a docked window tab (but don't leave the tab bounds for now). 2. While still holding the left mouse button, click the right mouse button to let the context menu appear. 3. Now drag the tab outside the tab bar until the window gets undocked (for example to the blue region above the docked windows). 4. Finish dragging by releasing the left mouse button. 5. Move the mouse cursor over the title bar of another docked window -> the window is undocked without interacting with it and will stick to the cursor until you click the mouse button to release it. Workaround: bool flag = false; public Form1() { InitializeComponent(); ContextMenuService menuService = this.radDock1.GetService<ContextMenuService>(); menuService.ContextMenuDisplaying += menuService_ContextMenuDisplaying; DragDropService service = this.radDock1.GetService<DragDropService>(); service.Starting += service_Starting; } void service_Starting(object sender, StateServiceStartingEventArgs e) { e.Cancel = flag; flag = false; } void menuService_ContextMenuDisplaying(object sender, ContextMenuDisplayingEventArgs e) { flag = true; }
To reproduce: Add a few document windows to a RadDock. Start the application and start dragging a document window's tab, do not move the mouse much, you want to keep the red cursor. While at it press escape. The drag operation will be canceled. Now move your mouse over the tabs and you will notice that they will be dragged. Workaround: When the Drag service stops we need to reset some fields. public Form1() { InitializeComponent(); foreach (Control child in ControlHelper.EnumChildControls(this.radDock1, true)) { DocumentTabStrip docStrip = child as DocumentTabStrip; if (docStrip != null) { RadPageViewElement pageViewElement = docStrip.TabStripElement; pageViewElement.ItemDragService.Stopping += ItemDragService_Stopping; pageViewElement.ItemDragService.Started += ItemDragService_Started; break; } } } void ItemDragService_Started(object sender, EventArgs e) { foreach (DockTabStrip strip in DockHelper.GetDockTabStrips<DockTabStrip>(this, true, this.radDock1)) { strip.MouseDown += strip_MouseDown; strip.MouseUp += strip_MouseUp; strip.MouseCaptureChanged += strip_MouseCaptureChanged; strip.MouseMove += strip_MouseMove; } } void ItemDragService_Stopping(object sender, RadServiceStoppingEventArgs e) { foreach (DockTabStrip strip in DockHelper.GetDockTabStrips<DockTabStrip>(this, true, this.radDock1)) { strip.MouseDown -= strip_MouseDown; strip.MouseUp -= strip_MouseUp; strip.MouseCaptureChanged -= strip_MouseCaptureChanged; strip.MouseMove -= strip_MouseMove; strip.GetType().GetMethod("OnMouseCaptureChanged", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(strip, new object[] { EventArgs.Empty }); typeof(TabStripPanel).GetField("dragStart", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(strip, Point.Empty); } } void strip_MouseMove(object sender, MouseEventArgs e) { if (this.isMouseDown.ContainsKey(sender) && !this.isMouseDown[sender]) { sender.GetType().BaseType.BaseType.GetField("dragging", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(sender, true); } } Dictionary<object, bool> isMouseDown = new Dictionary<object, bool>(); void strip_MouseCaptureChanged(object sender, EventArgs e) { this.isMouseDown[sender] = false; } void strip_MouseUp(object sender, MouseEventArgs e) { this.isMouseDown[sender] = false; } void strip_MouseDown(object sender, MouseEventArgs e) { this.isMouseDown[sender] = true; }
To reproduce: - Dock a tool window in a black RadDock. - Drag and drop the toolwindow in the top, bottom, right or left docking guides in the center. - The tool window is docked as document window and fills the entire space. Workaround: public Form1() { InitializeComponent(); DragDropService service = this.radDock1.GetService<DragDropService>(); service.PreviewHitTest += service_PreviewHitTest; radDock1.DockStateChanged += radDock1_DockStateChanged; } void radDock1_DockStateChanged(object sender, DockWindowEventArgs e) { if (dropTarget is DocumentContainer) { if (position != null && position != "Fill") { e.DockWindow.DockState = DockState.Docked; switch (position) { case "Top": radDock1.DockWindow(e.DockWindow, DockPosition.Top); break; case "Left": radDock1.DockWindow(e.DockWindow, DockPosition.Left); break; case "Right": radDock1.DockWindow(e.DockWindow, DockPosition.Right); break; case "Bottom": radDock1.DockWindow(e.DockWindow, DockPosition.Bottom); break; } position = null; } } } string position = null; object dropTarget = null; void service_PreviewHitTest(object sender, DragDropHitTestEventArgs e) { if (e.HitTest.GuidePosition != null) { dropTarget = e.DropTarget; position = e.HitTest.DockPosition.Value.ToString(); Console.WriteLine(e.DropTarget); } }
To reproduce: Use the following methods which adds host windows to ToolTabStrip and set the ShowItemCloseButton: private void AddDocumentStrip() { // Create and add a document strip to the dock. this.documentstrip = new ToolTabStrip(); this.documentstrip.TabStripAlignment = TabStripAlignment.Top; this.documentstrip.CaptionVisible = false; this.documentstrip.ActionMenuButton.Visibility = ElementVisibility.Hidden; this.DocumentDock.Controls.Add(documentstrip); this.DocumentDock.ShowToolCloseButton = true; } private void radCommandBar1_Click(object sender, EventArgs e) { RadForm testdoc = new RadForm(); // Create a hostwindow to hold the document (so can interact with the dock) HostWindow hostwindow = new HostWindow(); hostwindow.Text = "Document " + DocumentDock.DockWindows.Count.ToString(); hostwindow.ToolCaptionButtons = ToolStripCaptionButtons.Close; // Load the document into the host window hostwindow.LoadContent(testdoc); // Set the floating size when it is undocked Size size = new Size(660, 440); hostwindow.DefaultFloatingSize = size; // Make sure a closed document releases its resources hostwindow.CloseAction = DockWindowCloseAction.CloseAndDispose; // Check if we are opening our first document, requires additional setup //if (currentdocuments.Count == 0) if (DocumentDock.ActiveWindow == null) { if (this.DocumentDock.Controls.Count < 2) { this.documentstrip.Controls.Add(hostwindow); this.documentstrip.CaptionVisible = true; this.DocumentDock.Controls.Add(documentstrip); this.DocumentDock.ShowToolCloseButton = true; } else { ((ToolTabStrip)this.DocumentDock.Controls[1]).Controls.Add(hostwindow); ((ToolTabStrip)this.DocumentDock.Controls[1]).CaptionVisible = true; this.DocumentDock.ShowToolCloseButton = true; } } else { documentstrip.Controls.Add(hostwindow); documentstrip.Show(); } this.documentstrip.Text = "Document " + DocumentDock.DockWindows.Count.ToString(); //Bring Analyzer to the front this.Activate(); } Click the button a few times, close all windows and click again. You will notice that the close button will not be visible in the new windows. Alternatively, you can download the sample project. Workaround: Manually set the ShowItemCloseButton property to each child ToolTabStrip: private void AddDocumentStrip() { // Create and add a document strip to the dock. this.documentstrip = new ToolTabStrip(); this.documentstrip.TabStripAlignment = TabStripAlignment.Top; this.documentstrip.CaptionVisible = false; this.documentstrip.ActionMenuButton.Visibility = ElementVisibility.Hidden; this.DocumentDock.Controls.Add(documentstrip); this.DocumentDock.ShowToolCloseButton = true; } private void radCommandBar1_Click(object sender, EventArgs e) { RadForm testdoc = new RadForm(); // Create a hostwindow to hold the document (so can interact with the dock) HostWindow hostwindow = new HostWindow(); hostwindow.Text = "Document " + DocumentDock.DockWindows.Count.ToString(); hostwindow.ToolCaptionButtons = ToolStripCaptionButtons.Close; // Load the document into the host window hostwindow.LoadContent(testdoc); // Set the floating size when it is undocked Size size = new Size(660, 440); hostwindow.DefaultFloatingSize = size; // Make sure a closed document releases its resources hostwindow.CloseAction = DockWindowCloseAction.CloseAndDispose; // Check if we are opening our first document, requires additional setup //if (currentdocuments.Count == 0) if (DocumentDock.ActiveWindow == null) { if (this.DocumentDock.Controls.Count < 2) { this.documentstrip.Controls.Add(hostwindow); this.documentstrip.CaptionVisible = true; this.DocumentDock.Controls.Add(documentstrip); this.DocumentDock.ShowToolCloseButton = true; } else { ((ToolTabStrip)this.DocumentDock.Controls[1]).Controls.Add(hostwindow); ((ToolTabStrip)this.DocumentDock.Controls[1]).CaptionVisible = true; foreach (ToolTabStrip strip in this.DocumentDock.EnumFrameworkControls<ToolTabStrip>()) { strip.ShowItemCloseButton = true; } } } else { documentstrip.Controls.Add(hostwindow); documentstrip.Show(); } this.documentstrip.Text = "Document " + DocumentDock.DockWindows.Count.ToString(); //Bring Analyzer to the front this.Activate(); }