Demonstra Passo a passo: Adicionando marcas inteligentes para um componente do Windows Forms

Marcas inteligentes são elementos de interface (UI) do usuário menu semelhante que fornecem opções usadas com freqüência de tempo de design. A maioria dos componentes padrão e os controles fornecidos com o.NET Framework contêm a marca inteligente e aperfeiçoamentos do designer do verbo. Os procedimentos neste passo a passo mostram como adicionar suporte a marcas inteligentes a componentes e controles personalizados.

Você pode adicionar marcas inteligentes para componentes de formulários de janela Opções de tempo de design de fonte usado. Itens em um painel de marcas inteligentes são logicamente agrupados por categoria e o indivíduo DesignerActionMethodItem instâncias opcionalmente podem ser duplicadas como entradas de verbo designer. Muitos dos componentes padrão e os controles fornecidos com o.NET Framework contêm a marca inteligente e aperfeiçoamentos do designer do verbo. Componente e autores de controle personalizado também podem adicionar suporte a marcas inteligentes, normalmente usando o modelo de envio.

A adição de marcas inteligentes com o modelo de envio requer as seguintes adições ao projeto componente:

  • Implementação de uma classe derivada de DesignerActionList, que define os métodos e propriedades que são alvos de itens de menu de marcas inteligentes. Essa classe também fornecer uma substituição GetSortedActionItems método que retorna uma matriz de DesignerActionItem instâncias.

  • A classe designer associada ao componente deve implementar a ActionLists propriedade. Recuperar esta propriedade fornece o DesignerActionListCollection , que contém todas as DesignerActionList instâncias associadas com um único menu de marcas inteligentes. Geralmente, há apenas uma lista como uma coleção.

ObservaçãoObservação

Painéis de marcas inteligentes não oferecer suporte a rolagem ou de paginação, portanto, tenha cuidado para não preencher seus painéis com muitos itens de marcas inteligentes. Muitos itens podem resultar em Painel de marcas inteligentes que ultrapasse o limite da tela.

O procedimento a seguir demonstra como adicionar marcas inteligentes usando código de controle de um exemplo simples, ColorLabel, que é derivada de formulários padrão do Windows Label de controle. Este controle tem um designer associado nomeados ColorLabelDesigner.

Para copiar o código deste tópico como uma única lista, consulte Como: Anexar marcas inteligentes para um componente do Windows Forms.

Pré-requisitos

A fim de concluir este explicação passo a passo, será necessário:

  • Permissões suficientes para poder criar e executar projetos de aplicativo do Windows Forms no computador onde o.NET Framework é instalado.

Para implementar uma classe derivada de DesignerActionList

  1. No mesmo namespace seu componente, adicione a declaração de sua classe derivada de DesignerActionList.

    ObservaçãoObservação

    Você deve adicionar uma referência ao assembly de tempo de design, System.Design.dll. Este assembly não está incluído na.NET Framework 4 o perfil do cliente. Para adicionar uma referência a System.Design.dll, você deve alterar a estrutura do projeto de destino para .NET Framework 4.

    Public Class ColorLabelActionList
        Inherits System.ComponentModel.Design.DesignerActionList
    
    public class ColorLabelActionList :
              System.ComponentModel.Design.DesignerActionList
    
  2. Adicione um construtor para essa classe que leva a uma instância do controle associado. Forneça um campo privado para manter uma referência a essa instância. Também fornecer um campo privado para armazenar em cache uma referência para o DesignerActionService. Isso será usado para atualizar a lista.

    Private colLabel As ColorLabel
    
    
    ...
    
    
    Private designerActionUISvc As DesignerActionUIService = Nothing
    
    
    ...
    
    
    Public Sub New(ByVal component As IComponent)
    
        MyBase.New(component)
        Me.colLabel = component
    
        ' Cache a reference to DesignerActionUIService, so the
        ' DesigneractionList can be refreshed.
        Me.designerActionUISvc = _
        CType(GetService(GetType(DesignerActionUIService)), _
        DesignerActionUIService)
    
    End Sub
    
    private ColorLabel colLabel;
    
    
    ...
    
    
    private DesignerActionUIService designerActionUISvc = null;
    
    
    ...
    
    
    public ColorLabelActionList( IComponent component ) : base(component) 
    {
        this.colLabel = component as ColorLabel;
    
        // Cache a reference to DesignerActionUIService, so the
        // DesigneractionList can be refreshed.
        this.designerActionUISvc =
            GetService(typeof(DesignerActionUIService))
            as DesignerActionUIService;
    }
    
  3. Adicione métodos e propriedades que você deseja associar aos itens de marcas inteligentes. Métodos serão executados quando suas entradas de marca inteligente correspondente é selecionada. As propriedades devem ter as seções do getter para que seu valor atual é exibida; Opcionalmente, eles podem ter seções setter que usam o GetProperties método se seus valores estejam editável a partir da entrada de marca inteligente correspondente.

    ObservaçãoObservação

    Como é o caso em todo o ambiente de tempo de design, uma propriedade é capaz de que está sendo editado somente se um dos tipos base fornecido pelo.NET Framework, o tipo pode ser facilmente convertido em um tipo base um fornecido TypeConverter, ou quando um personalizado UITypeEditor é fornecido.

    Public Property ForeColor() As Color
        Get
            Return colLabel.ForeColor
        End Get
        Set(ByVal value As Color)
            GetPropertyByName("ForeColor").SetValue(colLabel, value)
        End Set
    End Property
    
    
    ...
    
    
    'Boolean properties are automatically displayed with binary 
    ' UI (such as a checkbox).
    Public Property LockColors() As Boolean
        Get
            Return colLabel.ColorLocked
        End Get
        Set(ByVal value As Boolean)
            GetPropertyByName("ColorLocked").SetValue(colLabel, value)
    
            ' Refresh the list.
            Me.designerActionUISvc.Refresh(Me.Component)
        End Set
    End Property
    
    
    ...
    
    
    Public Sub InvertColors()
        Dim currentBackColor As Color = colLabel.BackColor
        BackColor = Color.FromArgb( _
        255 - currentBackColor.R, _
        255 - currentBackColor.G, _
        255 - currentBackColor.B)
    
        Dim currentForeColor As Color = colLabel.ForeColor
        ForeColor = Color.FromArgb( _
        255 - currentForeColor.R, _
        255 - currentForeColor.G, _
        255 - currentForeColor.B)
    End Sub
    
    public Color ForeColor
    {
        get
        {
            return colLabel.ForeColor;
        }
        set
        {
            GetPropertyByName("ForeColor").SetValue(colLabel, value);
        }
    }
    
    
    ...
    
    
    // Boolean properties are automatically displayed with binary 
    // UI (such as a checkbox).
    public bool LockColors
    {
        get
        {
            return colLabel.ColorLocked;
        }
        set
        {
            GetPropertyByName("ColorLocked").SetValue(colLabel, value);
    
            // Refresh the list.
            this.designerActionUISvc.Refresh(this.Component);
        }
    }
    
    
    ...
    
    
    public void InvertColors()
    {
        Color currentBackColor = colLabel.BackColor;
        BackColor = Color.FromArgb(
            255 - currentBackColor.R, 
            255 - currentBackColor.G, 
            255 - currentBackColor.B);
    
        Color currentForeColor = colLabel.ForeColor;
        ForeColor = Color.FromArgb(
            255 - currentForeColor.R, 
            255 - currentForeColor.G, 
            255 - currentForeColor.B);
    }
    
  4. Opcionalmente, implementar uma versão de substituição de GetSortedActionItems método para retornar uma matriz de DesignerActionItem instâncias, onde cada item está associado a uma propriedade ou método criado na etapa anterior. Você pode fazer isso para alterar a ordem dos itens, categorizá-las ou opcionalmente mostrá-los. A lista também pode incluir itens estáticos, como, por exemplo, títulos de grupo lógico.

    Public Overrides Function GetSortedActionItems() _
    As DesignerActionItemCollection
        Dim items As New DesignerActionItemCollection()
    
        'Define static section header entries.
        items.Add(New DesignerActionHeaderItem("Appearance"))
        items.Add(New DesignerActionHeaderItem("Information"))
    
        'Boolean property for locking color selections.
        items.Add(New DesignerActionPropertyItem( _
        "LockColors", _
        "Lock Colors", _
        "Appearance", _
        "Locks the color properties."))
    
        If Not LockColors Then
            items.Add( _
            New DesignerActionPropertyItem( _
            "BackColor", _
            "Back Color", _
            "Appearance", _
            "Selects the background color."))
    
            items.Add( _
            New DesignerActionPropertyItem( _
            "ForeColor", _
            "Fore Color", _
            "Appearance", _
            "Selects the foreground color."))
    
            'This next method item is also added to the context menu 
            ' (as a designer verb).
            items.Add( _
            New DesignerActionMethodItem( _
            Me, _
            "InvertColors", _
            "Invert Colors", _
            "Appearance", _
            "Inverts the fore and background colors.", _
            True))
        End If
        items.Add( _
        New DesignerActionPropertyItem( _
        "Text", _
        "Text String", _
        "Appearance", _
        "Sets the display text."))
    
        'Create entries for static Information section.
        Dim location As New StringBuilder("Location: ")
        location.Append(colLabel.Location)
        Dim size As New StringBuilder("Size: ")
        size.Append(colLabel.Size)
    
        items.Add( _
        New DesignerActionTextItem( _
        location.ToString(), _
        "Information"))
    
        items.Add( _
        New DesignerActionTextItem( _
        size.ToString(), _
        "Information"))
    
        Return items
    End Function
    
    public override DesignerActionItemCollection GetSortedActionItems()
    {
        DesignerActionItemCollection items = new DesignerActionItemCollection();
    
        //Define static section header entries.
        items.Add(new DesignerActionHeaderItem("Appearance"));
        items.Add(new DesignerActionHeaderItem("Information"));
    
        //Boolean property for locking color selections.
        items.Add(new DesignerActionPropertyItem("LockColors",
                         "Lock Colors", "Appearance",
                         "Locks the color properties."));
        if (!LockColors)
        {
            items.Add(new DesignerActionPropertyItem("BackColor",
                             "Back Color", "Appearance",
                             "Selects the background color."));
            items.Add(new DesignerActionPropertyItem("ForeColor",
                             "Fore Color", "Appearance",
                             "Selects the foreground color."));
    
            //This next method item is also added to the context menu 
            // (as a designer verb).
            items.Add(new DesignerActionMethodItem(this,
                             "InvertColors", "Invert Colors",
                             "Appearance",
                             "Inverts the fore and background colors.",
                              true));
        }
        items.Add(new DesignerActionPropertyItem("Text",
                         "Text String", "Appearance",
                         "Sets the display text."));
    
        //Create entries for static Information section.
        StringBuilder location = new StringBuilder("Location: ");
        location.Append(colLabel.Location);
        StringBuilder size = new StringBuilder("Size: ");
        size.Append(colLabel.Size);
        items.Add(new DesignerActionTextItem(location.ToString(),
                         "Information"));
        items.Add(new DesignerActionTextItem(size.ToString(),
                         "Information"));
    
        return items;
    }
    

Para atualizar a classe do designer associada para implementar a propriedade ActionLists

  1. Localize a classe designer para o controle. Se não existir, crie uma classe designer e associá-la para a classe de controle. Para obter mais informações sobre os designers, consulte Classes base do Designer.

  2. Como uma técnica de otimização, adicione um campo particular do tipo DesignerActionListCollection.

    Private lists As DesignerActionListCollection
    
    private DesignerActionListCollection actionLists;
    
  3. Adicionar o substituído ActionLists propriedade para retornar uma nova instância da ColorLabelActionList classe que você criou anteriormente.

    Public Overrides ReadOnly Property ActionLists() _
    As DesignerActionListCollection
        Get
            If lists Is Nothing Then
                lists = New DesignerActionListCollection()
                lists.Add( _
                New ColorLabelActionList(Me.Component))
            End If
            Return lists
        End Get
    End Property
    
    public override DesignerActionListCollection ActionLists
    {
        get
        {
            if (null == actionLists)
            {
                actionLists = new DesignerActionListCollection();
                actionLists.Add(
                    new ColorLabelActionList(this.Component));
            }
            return actionLists;
        }
    }
    

Comentários

Várias áreas do código merecem uma explicação mais detalhada:

  • Quando uma propriedade ou método na classe derivada de DesignerActionList altera o estado do controle associado, essas alterações não devem ser feitas por chamadas de setter direto para propriedades. o componente Em vez disso, essas alterações devem ser feitas por meio do adequadamente criadas PropertyDescriptor. Essa abordagem indireta garante que desfazer de marcas inteligentes e a interface do usuário atualizar a função de ações corretamente.

  • Você pode atualizar dinamicamente o painel de marcas inteligentes chamando DesignerActionUIService.Refresh. Esse processo pode ser usado para alterar dinamicamente o conteúdo do painel de marcas inteligentes. No exemplo, as marcas inteligentes preocupadas com a alteração de cores incluídos condicionalmente dependendo do estado do LockColors propriedade. Essa propriedade booleana também está associada uma marca inteligente, para que o desenvolvedor possa bloquear ou desbloquear a seleção de cores atual, pelo menos por meio do menu.

  • Uma entrada de marca inteligente do tipo DesignerActionMethodItem pode ser incluído opcionalmente no menu de atalho para o controle associado, definindo a includeAsDesignerVerb parâmetro no construtor para true. A.NET Framework, em seguida, cria implicitamente um correspondente DesignerVerb e o adiciona ao menu de atalho para você. Neste exemplo, o InvertColors item é tratado neste modo.

  • Itens de marcas inteligentes são agrupados em um painel por seus Category propriedade, que é definida no construtor para cada item. Se essa propriedade não estiver explicitamente definida, ela é atribuída para a categoria padrão. Cada item é ordenada no painel de marcas inteligentes por categoria e, em seguida, por ordem de ocorrência no DesignerActionItem matriz retornada pela classe derivada de DesignerActionList classe. Este exemplo contém duas categorias: Appearance e Information.

    ObservaçãoObservação

    Não DesignerActionHeaderItem é fornecido para a segunda categoria.

  • Uma entrada que exibe informações de texto estático pode ser implementada usando um DesignerActionTextItem ou DesignerActionPropertyItem cuja propriedade associada contém apenas um setter. Este exemplo usa a primeira abordagem.

Próximas etapas

Assim que tiver iniciado o seu componente de integração no ambiente de tempo de design, considere expandindo seu suporte de designer.

Consulte também

Referência

DesignerVerb

DesignerActionItem

DesignerActionList

ActionLists

DesignerActionService

Conceitos

Comandos de Designer e o modelo de objeto de DesignerAction para Windows Forms