Sdílet prostřednictvím


Názorný postup: Přidání komponenty model Windows Forms inteligentní značky

Inteligentní značky jsou prvky podobné nabídky uživatelského rozhraní (UI), které běžně používaných možností návrhu.Většina standardních komponent a ovládacích prvků s.NET Framework obsahuje inteligentní značky a vylepšení návrháře sloveso.Postupy v tomto návodu ukazují, jak přidat podporu smart tag komponenty a vlastní ovládací prvky.

Okno formuláře součástí dodávky běžně používané možnosti návrhu můžete přidat inteligentní značky.Položek v panelu značky smart jsou logicky seskupeny podle kategorií a jednotlivých DesignerActionMethodItem instance může být volitelně duplicitní jako položky návrháře sloveso.Standardní součástí a ovládací prvky s mnoha.NET Framework obsahuje inteligentní značky a vylepšení návrháře sloveso.Komponenty a autoři vlastní ovládací prvek můžete také přidat podporu smart tag, obvykle pomocí modelu push.

Přidání inteligentní značky, modelu push vyžaduje následující dodatky k součásti projektu:

[!POZNÁMKA]

Smart tag panely nepodporují posouvání nebo stránkování, takže dejte pozor, abyste naplnit vaše panely s mnoha položek smart tag.V panelu značky smart přesahující hranice obrazovky může způsobit příliš mnoho položek.

Následující postup ukazuje, jak přidat inteligentní značky pomocí kódu z jednoduchý příklad ovládacího prvku, ColorLabel, který je odvozen od standardní model Windows Forms Label řízení.Tento ovládací prvek související designer, s názvem ColorLabelDesigner.

Chcete-li zkopírovat kód v tomto tématu jako jediný výpis, viz Jak: připojit ke komponentě model Windows Forms inteligentní značky.

Požadavky

K dokončení tohoto návodu budete potřebovat:

  • Dostatečná oprávnění, budete moci vytvořit a spustit v počítači aplikace projekty model Windows Forms kde.NET Framework nainstalována.

K implementaci třídy odvozené od DesignerActionList

  1. V stejný obor názvů jako komponenty přidat prohlášení třídy odvozené z DesignerActionList.

    [!POZNÁMKA]

    Je nutné přidat odkaz na sestavení návrhu, System.Design.dll.Toto sestavení není součástí.NET Framework 4 profilu klienta.Chcete-li přidat odkaz na System.Design.dll, je nutné změnit cílový rámec projektu na .NET Framework 4.

    Public Class ColorLabelActionList
        Inherits System.ComponentModel.Design.DesignerActionList
    
    public class ColorLabelActionList :
              System.ComponentModel.Design.DesignerActionList
    
  2. Do této třídy, která přebírá instanci přidružený ovládací prvek přidáte konstruktor.Zadejte pole private držet odkaz na tuto instanci.Zadat také soukromé mezipaměti odkaz na pole DesignerActionService.Použije k aktualizaci seznamu.

    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. Přidání metod a vlastností, které chcete přidružit k položkám smart tag.Metody bude spuštěn při výběru jejich odpovídající položku smart tag.Vlastnosti by měly mít getter oddíly tak, aby jejich aktuální hodnota je zobrazena; Volitelně mohou mít setter oddíly, které používají GetProperties metodou, pokud jejich hodnoty jsou upravitelné z odpovídající položku smart tag.

    [!POZNÁMKA]

    Jako je tomu v celém prostředí návrhu, je schopen upravován pouze v případě, že jeden ze základních typů poskytnutých vlastnost.NET Framework, typ lze převést do základního typu podle zadaný TypeConverter, nebo při vlastní UITypeEditor se dodává.

    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. Volitelně implementovat potlačenou verzi GetSortedActionItems metoda vrátí matici DesignerActionItem instance, kde každá položka je přiřazena vlastnost nebo metoda vytvořili v předchozím kroku.Provést změnit pořadí položek, jejich kategorizaci nebo je můžete také zobrazit.Seznam může též zahrnovat statické položky, jako jsou například názvy logické skupiny.

    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;
    }
    

Aktualizovat přidružený návrháře třída implementovat vlastnost ActionLists

  1. Vyhledejte návrháře třídy pro ovládací prvek.Pokud neexistuje, vytvořte třídu návrháře a přidružení třídy řízení.Další informace v Návrháři Základní třídy Designer.

  2. Jako technika optimalizaci přidat soukromé pole typu DesignerActionListCollection.

    Private lists As DesignerActionListCollection
    
    private DesignerActionListCollection actionLists;
    
  3. Přidat lokálně ActionLists vlastnost vrátit novou instanci ColorLabelActionList třídy, který jste vytvořili dříve.

    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;
        }
    }
    

Komentáře

Několik oblastí kód si zaslouží podrobnější vysvětlení:

  • Pokud vlastnost nebo metodu třídy odvozené z DesignerActionList změní stav přidružené řízení těchto změn by nemělo být prováděno setter přímé volání na vlastnosti komponenty.Místo toho je třeba tyto změny prostřednictvím vhodně vytvořený PropertyDescriptor.Tento nepřímý přístup zajišťuje, že smart tag zpět a UI aktualizovat funkce akce správně.

  • Panel smart tag můžete dynamicky aktualizovat voláním DesignerActionUIService.Refresh.Tento proces lze dynamicky měnit obsah panelu smart tag.V příkladu jsou podmíněně zahrnuty v závislosti na stavu inteligentních značek se změnou barvy LockColors vlastnost.Tato booleovská vlastnost je přidružen inteligentních značek také tak, že vývojář můžete zamknout nebo odemknout aktuální výběr barev alespoň prostřednictvím nabídky.

  • Smart tag položku typu DesignerActionMethodItem mohou být volitelně součástí místní nabídku pro ovládací prvek související nastavení includeAsDesignerVerb parametr do konstruktoru true.Na.NET Framework implicitně vytvoří odpovídající DesignerVerb a přidá do místní nabídky pro vás.V tomto příkladu InvertColors zboží je ošetřené tímto způsobem.

  • Smart tag položky seskupeny v panelu podle jejich Category vlastnost, která je nastavena v konstruktoru pro každou položku.Pokud tato vlastnost není explicitně nastaven, je přiřazena výchozí kategorie.Každá položka je Objednáno v panelu značky smart podle kategorie a potom podle pořadí výskytu v DesignerActionItem pole vrácené třídy odvozené od DesignerActionList třídy.V tomto příkladu obsahuje dvě kategorie: Appearance a Information.

    [!POZNÁMKA]

    Ne DesignerActionHeaderItem dodává druhé kategorie.

  • Položku, která zobrazuje informace o statický text, mohou být implementovány pomocí buď DesignerActionTextItem nebo DesignerActionPropertyItem jehož přidruženou vlastnost obsahuje pouze setter.Tento příklad používá bývalé přístup.

Další kroky

Po spuštění komponenty integrace do prostředí návrhu zvážit rozšíření podpory návrháře.

Viz také

Referenční dokumentace

DesignerVerb

DesignerActionItem

DesignerActionList

ActionLists

DesignerActionService

Koncepty

Příkazy pro návrháře a modelu objektu DesignerAction pro model Windows Forms