Unplanned
Last Updated: 31 Mar 2026 15:46 by Craig
Gary
Created on: 09 Feb 2026 20:25
Category: DockManager
Type: Feature Request
12
Data-Driven DockManager

Goal

Our application needs to allow end users to dynamically customize the Telerik Blazor DockManager at runtime by:

  • Adding new panels
  • Removing existing panels
  • Rearranging and resizing panels

 

These changes should be fully user-driven and persisted so that:

  • The layout is restored when the user returns
  • The layout is consistent across browsers and devices

 

In short, we want the DockManager to behave as a customizable dashboard whose state can be reliably stored and reloaded from our database.

 

 

Problem

The current Telerik Blazor DockManager implementation requires panels to be declared in Razor markup (markup driven) and managed through an external data source.

 

This creates several challenges:

  • The component state (DockState) is tightly coupled to the initial panel definitions.
  • Dynamically adding or removing panels from the data source conflicts with the internal DockState.
  • To synchronize changes, we must manually manipulate the DockState object using custom code.
  • This manipulation relies on internal behavior that is not formally supported and may break in future Telerik releases.

 

As a result, implementing a truly dynamic and persistent DockManager layout requires complex workarounds that are fragile and difficult to maintain.

 

 

Feature Request

We propose enhancing the DockManager with first-class support for dynamic panel synchronization by introducing:

Two coordinated parameters:

  • Data – the collection of panels
  • DockState – the persisted layout information

 

Expected behavior:

  • If the Data collection contains a panel that is not present in the DockState, the component should automatically:
    • Add the new panel to the layout
    • Place it at the end of the current structure (bottom or right, depending on layout)
    • Update the DockState accordingly
  • If the DockState contains a panel that is no longer present in the Data collection, the component should automatically:
    • Remove that panel from the layout
    • Update the DockState accordingly

 

This would allow developers to treat the DockManager as a true data-driven component, similar to other Telerik Blazor controls, without needing to manually modify internal state structures.

12 comments
Craig
Posted on: 31 Mar 2026 15:46

Yanislav,

 

That worked beautifully! For my purposes I'm good to go! I'll defer back to the original requester but thank you for looking at this!

ADMIN
Yanislav
Posted on: 31 Mar 2026 06:59

Hello Craig,

You can add new panes inside both floating and non-floating containers, however, to support dynamic insertion, the parent container must persist.

Please review this example: https://blazorrepl.telerik.com/GguRnbYK55cx0zD648.

It uses a DockManagerSplitPane with AllowEmpty="true", which acts as the necessary anchor for adding content panes dynamically. While this differs slightly from inserting panes directly as children of DockManagerPanes, it ensures the structure remains intact. Let me know if this approach meets your requirements.

Regards,
Yanislav
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Craig
Posted on: 24 Mar 2026 18:06

Hello again Yanislav,

Thank you for your help. I am happy to make another issue but I think fundamentally it is the same issue.

 

Requirement: When new ContentPanes are first added AFTER the first render of TelerikDockManager, render them so they are available.

 

What is happening now: If a ContentPane is added AFTER the first render (either somewhere in the <DockManagerPanes> or the <DockManagerFloatingPanes> hierarchy), Telerik creates a "dummy placeholder" for the ContentPane.

 

Why is this happening?: Because the only time content panes are rendered now is on the first call to TelerikDockManager.OnAfterRenderAsync

 

Why is this a problem: Scenarios where the content is chosen by the user (a very common scenario) is difficult

 

What is the current workaround: Either (1) Flash the screen to drop and re-render the entire DockManager - very bad (2) Create a bunch of hidden ContentPanes in a floating container, then manage their use - works but not ideal.

 

The problem is clear - we need to be able to add content panes after the first render of TelerikDockManager.

All of the existing commentary has just been offering possible solutions to that issue, solve it however you like but please solve it. Thank you!

 

Craig

 

 

 

ADMIN
Yanislav
Posted on: 24 Mar 2026 11:14

Hello Gary,

I will try to answer your questions below:

1. As for the Closeable parameter - by design, a closed pane is not a removed pane. While adding a built-in UI for restoring closed panes is a valid feature request, they currently remain in the state because restoring them (setting Visible="true") forces the DockManager to find their appropriate place in the layout based on their last visible position.

The state becomes "bloated" because the shared implementation continuously adds new pane instances instead of restoring closed ones. You can bind the Visible field (@bind-Visible="paneEntity.Visible") and toggle the value after a pane is closed to restore it. This ensures it renders in the correct location without adding new panes. You can define all panes initially as non-visible and "restore" them to render. This is supported and works dynamically. REPL Example: https://blazorrepl.telerik.com/mKYHQyOs58W2gWNk12

Alternatively, if you require dynamically added panes with unknown content, you can use the safe container approach discussed earlier.

In short to your questions: 

> Using Closeable, is there a way to identify closed panes?

Since you are defining panes from a dataset, you can bind the panes and identify closed panes by filtering for those where `Visible == false`.

> Using Closeable, is there a way to remove a pane from the DockStateManager rather than setting Visible to false?

Currently, the Close button implementation simply raises the `VisibleChanged` event with a value of `false`.

> Is there a way to determine whether the layout stored in DockManagerState differs from the layout defined in the Razor page?

You can compare the initial state (captured when OnStateInit is triggered) with the current state obtained via the GetState method whenever a new pane is added. You can also track layout changes by monitoring the OnStateChanged event.

> If the layout differs from the Razor layout, can we conditionally use a "safe container"; otherwise, use the default layout?

Yes, this is a viable solution. You must ensure that the container where new panes are added remains present and is not destroyed by the DockManager.

I hope this information helps. Let me know if you need further assistance. 

===

Hello Craig, 

Thank you for your feedback and your interest in enhancing the DockManager component.

Could you please elaborate on the specific use case? I want to ensure I fully understand the purpose of the DynamicContentPanes configuration and its expected behavior. Since the DockManager utilizes a parent-child structure rather than flat collections that can be concatenated, it is currently unclear how these dynamic panes would render or interact with the existing hierarchy.

I am also interested in the requirement for dynamic parameters and how you envision them functioning. To provide the best possible solution, it would be helpful to understand your ultimate end goal rather than the specific configuration needs.

Side note: This appears to differ from the initial requirement in this thread. If so, to keep our communication organized, could you please open a separate thread to describe your goal and exact requirements?

Thank you for the additional details in advance. 

Regards,
Yanislav
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Craig
Posted on: 23 Mar 2026 17:16

I am adding my comments as someone who would also like a solution to the problem of dynamically adding ContentPanes.

The *only* solution that I could get to work at the moment was to add blank hidden panes to my own hidden floating splitter panel, then manage their placement on my own. It works fine but I have to create as many as I -think- I would need which can be inefficient. I would rather a solution like this:

 

POSSIBLE SOLUTION 1 - Add DynamicContentPanes parameter

 

- Include a DynamicContentPanes list parameter within the component. The TelerikDockManagerDynamicContentPane would look something like this:

  • Id - Guid (or keep as string to match your current implementation but it's really a Guid)
  • To match Microsoft existing <DynamicComponent>, include a Type and Parameters (IDictionary<string ,object>)

When rendering, see if any changes have occurred to DynamicContentPanes, and then perform the initial render of any new content panes.

Ideally it would also dispose of any dynamic content panes no longer present and follow the existing logic to update the DockState (e.g., leave a hole if AllowEmpty, etc. - no new logic just use what you already have)

If a DynamicContentPane is not specified in the layout, just keep it hidden within the special floating pane used to house DynamicContentPane items.

Add a OnDynamicContentChanged event - similar to OnStateInit where we can then situate the new content where we want by getting/setting the supplied DockState event argument.

 

This would be a non-breaking change. For me I would switch solely to DynamicContentPanes since that is my use case.

 

POSSIBLE SOLUTION 2 - Render any new DockManagerContentPane when first introduced

- On .Refresh or state change, rescan the defined <DockManagerPanes> and <DockManagerFloatingPanes> looking for new DockManagerContentPanes (or derived class). If present, perform its initial render and add it to the tracking context.

At present, OnAfterRenderAsync is only ever rendering any content on the first render. This is where the problem occurs.

 

I would prefer Solution 1, but either solution would work.

This would be an extremely useful addition to an already excellent component!

 

 

Gary
Posted on: 23 Mar 2026 12:18

Hi Yanislav,

 

 

Resize Evenly

Correct, there is only one implementation for Resize Evenly, and it is used in the demo for both the Default and Workaround modes.   The default behavior of our tiles/panes is to resize evenly using a configurable number of columns.  If a user changes the number of columns or selects Resize Evenly, then their current layout is lost and they are presented with all of their tiles/panes evenly spaced.  You may have noticed this feature works correctly only in Workaround mode.  In Default mode, the problem begins with the Closeable feature

When
Closeable is set to true, panes can be closed using the DockManagerContentPane's close button:
<DockManagerContentPane Class="" Unpinnable="false" Closeable="true" AllowFloat="true" Id="@ccy.Key" VisibleChanged="OnVisibleChanged">

 

Closing a pane sets the pane's Visible property false and fires the OnVisibleChange .  This results in two problems:

  1. The DockManagerState becomes bloated with hidden panes.  Since we have users that frequently add and remove tiles/panes, this is not desirable.
     
  2. The OnVisibleChange event does not identify which pane was removed. 
    public EventCallback<bool> VisibleChanged { get; set; }

If the closed pane cannot be identified, then it cannot be removed from the data source.  The technique used with @key is to reset the layout (or resize evenly) exposes this issue because previously closed panes reappear.

 

In Workaround mode, Closeable is set to false and a custom button is added in the header template to remove the tile/pane.   Using a custom remove button allows the application to:

  1. Identify the tile/pane closed and remove it from the data source. 
  2. Remove the pane from the DockStateManager to prevent JSON bloat of hidden panes.

 

 

Questions:

  1. Using Closeable, is there a way to identify closed panes?
  2. Using Closeable, is there a way to remove a pane from the DockStateManager rather than setting Visible to false?

 

 

 

Adding Panes

The suggestion to add a "safe container" may work; however, we need a way to determine whether the layout has changed. The layout defined in the Razor page is the desired layout initially, or when the user selects Resize Evenly.  Adding Panes works well until the user modifies the layout. 

 

Our requirement is:

 

  • If the layout matches the original Razor layout add panes evenly
  • If the layout has been modified by the user add panes to the end (bottom or right)

 

Questions

  1. Is there a way to determine whether the layout stored in DockManagerState differs from the layout defined in the Razor page?
  2. If the layout differs from the Razor layout, can we conditionally use a "safe container"; otherwise, use the default layout?
ADMIN
Yanislav
Posted on: 18 Mar 2026 14:21

Hi Gary,

Thank you for preparing the example and the video, I was able to reproduce the behavior. 

I will try to address the issues separately:

State Synchronization and Pane Persistence

The DockManager definition and its state are not synced. Once a user changes the layout, the definition and the state of the panes differ.

In your project, a split pane is rendered for each column. These are defined with AllowEmpty="false". This tells the DockManager to destroy any pane/splitter/column that has no children. By design, all parent panes (tab groups and splitter panes) are destroyed when empty.

You can keep these panes by setting AllowEmpty="true". This ensures the pane remains so new records can be rendered inside it. Otherwise, once a parent pane is left without children, the DockManager ignores it. This is the reason why sometimes the panes are not included even though they are part of the dataset.

Managing Empty Columns

If your goal is to avoid empty panes while keeping the AllowEmpty="false" configuration, you have two options:

  • Remove the column: Use the OnUndock event. Check the undocked content pane ID and the child count of the column (its parent). If the count is 0, remove the column from the dataset.
  • Hide the column: Use the same condition (children == 0) and set Visible="false".

This allows you to keep the column structure so new content panes are inserted evenly. Here is an example demonstrating this approach: https://blazorrepl.telerik.com/GAaHvWvI20ym4GK113

Potential Enhancements

Handling this manually requires tracking onDock and onUndock to count children for each column. I see an opportunity to improve this by exposing an event that tracks when a parent pane is left without children. This would allow you to hide and show it automatically. Let me know if you are interested in this feature, and we can log it for implementation.

Data-Driven DockManager

A data-driven approach will not simplify the process of adding new panes because the DockManager utilizes a multiple-tree structure. In this architecture, floating panes act as independent "mini-dockmanager" trees managed by the component.

Even if root panes are exposed, adding dynamic panes still requires you to access the current state and traverse the structure to identify the correct parent node.

If your primary goal is to add new panes into the layout, a more efficient method is to define an empty splitter pane and iterate your data within it. This acts as a "safe container" for dynamic children.

Please let me know if you would like me to prepare an example of this configuration.

===

Resize evenly 

Please correct me if I am mistaken, but the resize button in the provided example appears to function identically in both the workaround and default modes.

    public async Task ResizeEvenly()
    {
        await InvokeAsync(async () =>
        {
            Console.WriteLine("Resize Evenly");
            DockManagerKey = Guid.NewGuid().ToString();
            this.StateHasChanged();
        });
        TelerikNotificationRef?.Show(new NotificationModel() { Icon = Telerik.SvgIcons.SvgIcon.Check, CloseAfter = NotificationTimeout, ThemeColor = ThemeConstants.Notification.ThemeColor.Success, Text = $"Resized Evenly with {Columns} Columns." });
    }

I am not entirely sure of the exact purpose of this method, as it changes the @key directive value of the DockManager component. By default, if no Size parameter is passed to a pane, the splitter children are sized evenly. Changing the @key value triggers a complete re-render of the component, which resets all panes to their initial defined positions and calculates their size.

Sizing all content panes evenly can currently be achieved without re-rendering the entire component. However, this requires traversing the state, calculating the sibling count for each content pane, and manually setting its Size parameter. Since such implementation is complex, exposing a dedicated method to resize all panes evenly can be logged as a separate feature request.

However, I would like to ask you to elaborate more on your ultimate goal for this so we can discuss the best approach.

Please review these suggestions and let me know if I have missed any specific requirements.

Regards,
Yanislav
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

ADMIN
Ivan Danchev
Posted on: 17 Mar 2026 15:10

Hello Gary,

Thank you for attaching a solution and a video. We are in the process of reviewing and validating the requirements and will get back to you shortly. 

Regards,
Ivan Danchev
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Gary
Posted on: 11 Mar 2026 13:48

I added attached a solution that demonstrates the need to modify the DockStateManager.  Additionally, there is an annotated video of the web application that highlights the issues and workarounds.  
Craig
Posted on: 26 Feb 2026 03:46

100%!

 

Running into this issue now - quite tricky, every solution feels brittle.

 

Dave
Posted on: 10 Feb 2026 17:54
This is a great idea and would really make a difference to whether we continue to use Telerik controls or develop our own in house.
ADMIN
Ivan Danchev
Posted on: 10 Feb 2026 14:49

Hello Gary,

Thank you for the comprehensive explanation of the problem you are facing with the current DockManager capabilities and the functionality you've requested.

I've made the feature request public on our Feedback Portal, which would allow other members of the community to vote for it. 

Regards,
Ivan Danchev
Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.