File: System\Windows\Forms\Design\ControlDesigner.DockingActionList.cs
Web Access
Project: src\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.ComponentModel;
using System.ComponentModel.Design;
 
namespace System.Windows.Forms.Design;
 
public partial class ControlDesigner
{
    private class DockingActionList : DesignerActionList
    {
        private readonly IDesignerHost? _host;
 
        public DockingActionList(ControlDesigner owner)
            : base(owner.Component)
        {
            _host = GetService(typeof(IDesignerHost)) as IDesignerHost;
        }
 
        private string? GetActionName()
        {
            if (Component is null)
            {
                return null;
            }
 
            PropertyDescriptor? dockProp = TypeDescriptor.GetProperties(Component)["Dock"];
            if (dockProp is not null)
            {
                DockStyle dockStyle = (DockStyle)dockProp.GetValue(Component)!;
                if (dockStyle == DockStyle.Fill)
                {
                    return SR.DesignerShortcutUndockInParent;
                }
                else
                {
                    return SR.DesignerShortcutDockInParent;
                }
            }
 
            return null;
        }
 
        public override DesignerActionItemCollection GetSortedActionItems()
        {
            DesignerActionItemCollection items = [];
            string? actionName = GetActionName();
            if (actionName is not null)
            {
                items.Add(new DesignerActionVerbItem(new DesignerVerb(actionName, OnDockActionClick)));
            }
 
            return items;
        }
 
        private void OnDockActionClick(object? sender, EventArgs e)
        {
            if (sender is DesignerVerb designerVerb && _host is not null)
            {
                using DesignerTransaction t = _host.CreateTransaction(designerVerb.Text);
 
                // Set the dock prop to DockStyle.Fill
                PropertyDescriptor dockProp = TypeDescriptor.GetProperties(Component!)["Dock"]!;
                DockStyle dockStyle = (DockStyle)dockProp.GetValue(Component)!;
                dockProp.SetValue(Component, dockStyle == DockStyle.Fill ? DockStyle.None : DockStyle.Fill);
                t.Commit();
            }
        }
    }
}