elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Agregar propiedades a lista de tareas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Agregar propiedades a lista de tareas  (Leído 2,670 veces)
bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Agregar propiedades a lista de tareas
« en: 19 Octubre 2022, 08:46 am »

Lo que quiero saber es de que manera cuando se crea un control personalizado se puede colocar una propiedad del control en la lista de tareas del control, como lo hace por ejemplo el control PictureBox con la propiedad SizeMode o en el caso del TextBox lo hace con la propiedad MultiLine.


En línea

Elektro Enjuto

Desconectado Desconectado

Mensajes: 121



Ver Perfil WWW
Re: Agregar propiedades a lista de tareas
« Respuesta #1 en: 20 Octubre 2022, 01:46 am »

o en el caso del TextBox lo hace con la propiedad MultiLine.

Para WindowsForms es necesario tres cosas fundamentales:

1) Diseñar la clase de un control de usuario.
   -> System.Windows.Forms.UserControl
       (pongo como ejemplo esa clase a heredar, por no poner toda la lista de clases de los controles base.)

2) Diseñar la clase que proporciona servicios en tiempo de diseño para el control de usuario al que esté vinculado.
   -> System.Windows.Forms.Design.ControlDesigner

3) Diseñar la clase que proporciona una lista de acciones o "tareas" para el diseñador de control al que esté vinculado.
   -> System.ComponentModel.Design.DesignerActionList



En las url de arriba tienes ejemplos puntuales del uso de cada clase, y aquí tienes más documentación:

 - Designer Commands and the DesignerAction Object Model for Windows Forms.

 - Simplify UI Development with Custom Designer Actions in Visual Studio.



Por último, aquí abajo comparto el código fuente de un control de usuario heredado de la clase RichTextBox al que le he añadido una acción con nombre "MultiLine" que cumple la misma funcionalidad que la acción "MultiLine" de un TextBox. También le añadí la acción con nombre "Edit Text Lines" donde además demuestro como puedes invocar al editor de lineas mediante el uso de Reflection (aunque yo en el código original no utilizo Reflection, solo lo hice así para simplificar el código, pero si lo prefieres puedes invocar el editor de lineas como en este otro ejemplo: https://stackoverflow.com/a/43826903/1248295 ).

Todo esto ya lo tenía hecho de hace tiempo. El código fuente original de este control de usuario tiene varias miles de lineas. Lo he simplificado al máximo posible recortando todo lo innecesario e irrelevante para resolver tu duda. He recortado la lógica de preservación del texto multilinea al activar y desactivar la acción "MultiLine" ya que era mucho código, aunque por otro lado he dejado intacta la lógica de preservación del tamaño del control al activar y desactivar la acción "MultiLine", ya que eso si que me parece oportuno y relevante y es muy poquito código en comparación.



EnjutoRichTextBox.vb
Código
  1. #Region " EnjutoRichTextBox Class "
  2.  
  3. Namespace Enjuto.UserControls
  4.  
  5.    ''' <summary> A extended <see cref="RichTextBox"/> control.</summary>    
  6.    <DesignTimeVisible(True)>
  7.    <Designer(GetType(EnjutoRichTextBoxDesigner))>
  8.    <ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Require)>
  9.    Public Class EnjutoRichTextBox : Inherits RichTextBox
  10.  
  11. #Region " Fields "
  12.  
  13.        ''' <summary>Fixed control height for single-line mode.</summary>
  14.        Protected ReadOnly singleLineFixedControlHeight As Integer
  15.  
  16.        ''' <summary>Keeps track of control's height while multi-line is enabled.</summary>
  17.        Protected multiLineCurrentControlHeight As Integer
  18.  
  19. #End Region
  20.  
  21. #Region " Constructors "
  22.  
  23.        <DebuggerStepThrough>
  24.        Public Sub New()
  25.            Me.SuspendLayout()
  26.            Me.DoubleBuffered = True
  27.  
  28.            Using tb As New TextBox(), rtb As New RichTextBox()
  29.                Me.singleLineFixedControlHeight = tb.Size.Height
  30.                Me.Size = rtb.Size
  31.            End Using
  32.  
  33.            Me.ResumeLayout(performLayout:=False)
  34.        End Sub
  35.  
  36. #End Region
  37.  
  38. #Region " Event Invocators "
  39.  
  40.        ''' <summary>Raises the <see cref="EnjutoRichTextBox.MultilineChanged"/> event.</summary>
  41.        Protected Overrides Sub OnMultilineChanged(e As EventArgs)
  42.  
  43.            If Not Me.Multiline Then
  44.                Me.multiLineCurrentControlHeight = Me.Height
  45.                Me.Height = Me.singleLineFixedControlHeight
  46.                Me.SetStyle(ControlStyles.FixedHeight, True)
  47.  
  48.            Else
  49.                Me.SetStyle(ControlStyles.FixedHeight, False)
  50.                Me.Height = Me.multiLineCurrentControlHeight
  51.  
  52.            End If
  53.  
  54.            MyBase.OnMultilineChanged(e)
  55.  
  56.        End Sub
  57.  
  58. #End Region
  59.  
  60.    End Class
  61.  
  62. End Namespace
  63.  
  64. #End Region

EnjutoRichTextBoxDesigner.vb
Código
  1. Imports System.ComponentModel.Design
  2. Imports System.Windows.Forms.Design
  3.  
  4. #Region " EnjutoRichTextBoxDesigner Class"
  5.  
  6. Namespace Enjuto.UserControls
  7.  
  8.    ''' <summary>Provides design-time support for the <see cref="EnjutoRichTextBox"/> control.</summary>
  9.    Friend NotInheritable Class EnjutoRichTextBoxDesigner : Inherits ControlDesigner
  10.  
  11. #Region " Fields "
  12.  
  13.        Private actionListCollection As DesignerActionListCollection
  14.  
  15. #End Region
  16.  
  17. #Region " Properties "
  18.  
  19.        ''' <summary>Gets the design-time action lists supported by the component associated with the designer.</summary>
  20.        Public Overrides ReadOnly Property ActionLists As DesignerActionListCollection
  21.            Get
  22.                If Me.actionListCollection Is Nothing Then
  23.                    Me.actionListCollection = New DesignerActionListCollection From {
  24.                        New EnjutoRichTextBoxActionList(DirectCast(Me.Component, EnjutoRichTextBox))
  25.                    }
  26.                End If
  27.                Return Me.actionListCollection
  28.            End Get
  29.        End Property
  30.  
  31.        ''' <summary>Gets the selection rules that indicate the movement capabilities of a component.</summary>
  32.        Public Overrides ReadOnly Property SelectionRules As SelectionRules
  33.            Get
  34.                Dim rtb As EnjutoRichTextBox = DirectCast(MyBase.Control, EnjutoRichTextBox)
  35.                If rtb Is Nothing Then
  36.                    Return MyBase.SelectionRules
  37.                Else
  38.                    Return If(rtb.Multiline,
  39.                              SelectionRules.AllSizeable Or SelectionRules.Moveable,
  40.                              SelectionRules.LeftSizeable Or  ' Prevents control height resizing at design-time.
  41.                              SelectionRules.RightSizeable Or ' *
  42.                              SelectionRules.Moveable)        ' *
  43.                End If
  44.            End Get
  45.        End Property
  46.  
  47. #End Region
  48.  
  49.    End Class
  50.  
  51. End Namespace
  52.  
  53. #End Region

EnjutoRichTextBoxActionList.vb
Código
  1. Imports System.ComponentModel.Design
  2. Imports System.Diagnostics.CodeAnalysis
  3. Imports System.Reflection
  4. Imports System.Windows.Forms.Design
  5. Imports Enjuto.UserControls
  6.  
  7. #Region " EnjutoRichTextBoxActionList Class"
  8.  
  9. ''' <summary>Provides designer action list support for the <see cref="EnjutoRichTextBox"/> control.</summary>
  10. Friend NotInheritable Class EnjutoRichTextBoxActionList : Inherits DesignerActionList
  11.  
  12. #Region " Private Fields "
  13.  
  14.    <SuppressMessage("CodeQuality", "IDE0052:Remove unread private members", Justification:="Needed for EnjutoRichTextBoxActionList.New(component As EnjutoRichTextBox)")>
  15.    Private ReadOnly designerActionUISvc As DesignerActionUIService
  16.  
  17. #End Region
  18.  
  19. #Region " Properties "
  20.  
  21.    Public Shadows ReadOnly Property Component As EnjutoRichTextBox
  22.        Get
  23.            Return DirectCast(MyBase.Component, EnjutoRichTextBox)
  24.        End Get
  25.    End Property
  26.  
  27.    ''' <summary>Gets or sets a value indicating whether the text of the control can span more than one line.</summary>
  28.    Public Property MultiLine As Boolean
  29.        Get
  30.            Return Me.Component.Multiline
  31.        End Get
  32.        Set(value As Boolean)
  33.            Me.Component.Multiline = value
  34.        End Set
  35.    End Property
  36.  
  37. #End Region
  38.  
  39. #Region " Constructors "
  40.  
  41.    Public Sub New(component As EnjutoRichTextBox)
  42.  
  43.        MyBase.New(component)
  44.  
  45.        ' Cache a reference to DesignerActionUIService, so the DesigneractionList can be refreshed.
  46.        Me.designerActionUISvc = DirectCast(Me.GetService(GetType(DesignerActionUIService)), DesignerActionUIService)
  47.  
  48.    End Sub
  49.  
  50. #End Region
  51.  
  52. #Region " Public Methods "
  53.  
  54.    ''' <summary>Returns the collection of <see cref="DesignerActionItem"/> objects contained in the list.</summary>
  55.    ''' <returns>A <see cref="DesignerActionItem"/> array that contains the items in this list.</returns>
  56.    Public Overrides Function GetSortedActionItems() As DesignerActionItemCollection
  57.  
  58.        Dim items As New DesignerActionItemCollection From {
  59.                New DesignerActionHeaderItem("Behavior"),
  60.                New DesignerActionPropertyItem("MultiLine", "MultiLine", "Behavior",
  61.                                               "Controls whether the text of the control can span more than one line.")
  62.            }
  63.  
  64.        If Me.Component.Multiline Then
  65.            items.Add(New DesignerActionMethodItem(Me, "EditTextLines", "Edit Text Lines...", "Behavior",
  66.                                                       "Display the Lines collection editor.", includeAsDesignerVerb:=False))
  67.        End If
  68.  
  69.        Return items
  70.  
  71.    End Function
  72.  
  73. #End Region
  74.  
  75. #Region " Private Methods "
  76.  
  77.    ''' <summary> Displays a <see cref="MultilineStringEditor"/> to edit the text lines of the control.</summary>
  78.    Friend Sub EditTextLines()
  79.  
  80.        Dim rtb As EnjutoRichTextBox = Me.Component
  81.        Dim designerHost As IDesignerHost = rtb.Site.GetService(GetType(IDesignerHost))
  82.        Dim designer As IDesigner = designerHost.GetDesigner(rtb)
  83.  
  84.        Dim editorServiceContext As Type = GetType(ControlDesigner).Assembly.DefinedTypes.Where(Function(t As Type) t.Name = "EditorServiceContext").Single()
  85.        Dim editValue As MethodInfo = editorServiceContext.GetMethod("EditValue", BindingFlags.Static Or BindingFlags.Public)
  86.  
  87.        editValue.Invoke(Nothing, {designer, rtb, NameOf(rtb.Lines)})
  88.  
  89.    End Sub
  90.  
  91. #End Region
  92.  
  93. End Class
  94.  
  95. #End Region

-Enjuto Mojamuto "rey de los frikis" a su disposición para futuras dudas.


« Última modificación: 20 Octubre 2022, 02:38 am por Enjuto Mojamuto » En línea

@%$& #$ %&#$, ¡hay que decirlo más!.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines