es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La migración a UserControl con ToolStrip en .NET 6 no funciona.

Estoy tratando de crear un control de usuario que contenga múltiples controles.

Por ejemplo, un ToolStrip que sea editable en tiempo de diseño (agregar un Elemento en tiempo de diseño).
El siguiente código funciona en el .Net Framework 4.7, pero no en .NET 6.

“`[Designer(typeof (MyDesigner))]

public partial class AdvToolStrip : UserControl
{
public AdvToolStrip()
{
InitializeComponent();
}

<pre><code>[Category("Appearance")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ToolStrip NewToolStrip
{
get { return toolStrip1; }
}
</code></pre>

}

public class MyDesigner : System.Windows.Forms.Design.ControlDesigner
{
public override void Initialize(IComponent c)
{
base.Initialize(c);
AdvToolStrip ctl = (AdvToolStrip)c;
EnableDesignMode(ctl.NewToolStrip, "TS");
}
}“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un control de usuario que contenga varios controles, puede usar el código mencionado anteriormente. Este código crea un control de usuario AdvToolStrip que contiene un ToolStrip que se puede editar en tiempo de diseño agregando elementos.

    Sin embargo, el código funciona en .Net Framework 4.7 pero no en .NET 6. Parece que la clase ControlDesigner se ha eliminado en .NET 6, y el enfoque correcto para la funcionalidad de tiempo de diseño es utilizar la nueva interfaz IDesigner.

    Puede actualizar el código para que funcione en .NET 6 mediante la implementación de la interfaz IDesigner y la creación de un atributo de diseñador personalizado. Por ejemplo:

    [Designer(typeof(MyDesigner))]
    public partial class AdvToolStrip : UserControl
    {
        public AdvToolStrip()
        {
            InitializeComponent();
        }
    
        [Category("Appearance")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ToolStrip NewToolStrip
        {
            get { return toolStrip1; }
        }
    }
    
    public class MyDesigner : IDesigner
    {
        private DesignerVerbCollection _verns;
    
        public void Initialize(IComponent component)
        {
            AdvToolStrip control = (AdvToolStrip)component;
            ControlDesigner controlDesigner = (ControlDesigner)TypeDescriptor.CreateDesigner(control, typeof(ControlDesigner));
            controlDesigner.Initialize(component);
    
            _verns = new DesignerVerbCollection();
            _verns.Add(new DesignerVerb("Agregar elemento", OnAddItemClick));
        }
    
        private void OnAddItemClick(object sender, EventArgs e)
        {
            AdvToolStrip control = (AdvToolStrip)Component;
            ToolStripItem item = control.NewToolStrip.Items.Add("Nuevo elemento");
        }
    
        public void Dispose()
        {
        }
    
        public void DoDefaultAction()
        {
        }
    
        public DesignerVerbCollection Verbs
        {
            get { return _verns; }
        }
    
        public IComponent Component { get; private set; }
        public DesignerVerbCollection ActionLists { get; private set; }
        public bool ReadOnly { get; private set; }
        public object GetService(Type serviceType)
        {
            return null;
        }
    }
    

    Este código actualizado implementa IDesigner mediante la inicialización de un ControlDesigner y la adición de una DesignerVerbCollection con un verbo “Agregar elemento”. El método OnAddItemClick agrega un nuevo elemento al ToolStrip de AdvToolStrip cuando se hace clic en el verbo en el diseñador.

    En general, el enfoque basado en IDesigner debería funcionar tanto en .NET Framework 4.7 como en .NET 6.

Comments are closed.