Share via


İzlenecek yol: Windows Formları Bileşenine Akıllı Etiket Ekleme

Akıllı etiketler, yaygın olarak kullanılan tasarım zamanı seçenekleri sağlamak menü benzeri kullanıcı arabirimi (UI) öğeleridir.Çoğu standart bileşenleri ve denetimleri ile sağlanan.net Framework, akıllı etiket ve tasarımcı fiil geliştirmeler içerir.Bu izlenecek yolda yordamları akıllı etiket desteği bileşenlerini ve özel denetimler eklemek nasıl gösterir.

Pencere formları bileşenleri tedarik yaygın olarak kullanılan tasarım zamanı seçenekleri için akıllı etiketler ekleyebilirsiniz.Akıllı etiket paneldeki öğelerin kategori ve tek tek mantıksal olarak gruplandırılır DesignerActionMethodItem örnekleri isteğe bağlı çoğaltılmış Tasarımcı fiil girişleri olarak.Birçok standart bileşenleri ve denetimleri ile sağlanan.net Framework, akıllı etiket ve tasarımcı fiil geliştirmeler içerir.Bileşen ve özel denetim yazarlar da akıllı etiket desteği, genelde itme modelini kullanarak ekleyebilirsiniz.

Akıllı etiketlerle itme modelini ekleme bileşeni proje aşağıdaki eklemeler gerektirir:

  • Türetilmiş bir sınıf uygulaması DesignerActionList, hedefler akıllı etiket menü öğelerinin özellikleri ve yöntemleri tanımlar.Bu sınıf ayrıca geçersiz kılınmış bir sağlayabilir GetSortedActionItems dizisi döndürür yöntemi DesignerActionItem örnekleri.

  • Bileşenle ilişkili Tasarımcı sınıfını uygulamalıdır ActionLists özelliği.Bu özellik alma kaynakları DesignerActionListCollection tüm içeren DesignerActionList tek bir akıllı etiketi menüsü ile ilişkilendirilmiş örnekleri.Genellikle bu tür bir koleksiyonu yalnızca bir listesi vardır.

[!NOT]

Akıllı etiket panelleri kaydırma desteklememekte veya disk belleği, bu nedenle, birçok akıllı etiket öğelerini panellerle değil doldurmak dikkatli olun.Çok fazla öğe ekran sınırının ötesine genişletmek akıllı etiket panelinde neden olabilir.

Aşağıdaki yordam bir basit örnek denetim kodunu kullanarak akıllı etiketler eklemek gösterilmiştir ColorLabel, hangi standart Windows Forms türetilmiştir Label denetim.Adlı bir ilişkili Tasarımcısı bu denetime sahip ColorLabelDesigner.

Bu konuda tek bir liste olarak kodu kopyalamak için bkz: Nasıl yapılır: Windows Formları Bileşenine Akıllı Etiket Ekleme.

Önkoşullar

Bu izlenecek yolu tamamlamak için şunları yapmanız gerekir:

  • Oluşturma ve Windows Forms uygulama projelerinin bilgisayarda çalıştırmak için yeterli izinleri burada.net Framework yüklü.

DesignerActionList ' türetilmiş bir sınıf uygulamak için

  1. Sınıfınızın türetildiği için bileşeninizin olarak aynı ad alanında bildirimi eklemek DesignerActionList.

    [!NOT]

    Tasarım zamanı derleme, System.Design.dll bir başvuru eklemeniz gerekir.Bu derleme dahil edilmez.net Framework 4 istemci profili.System.Design.dll için bir başvuru eklemek için projenin hedef çerçevesini değiştirmek .net Framework 4.

    Public Class ColorLabelActionList
        Inherits System.ComponentModel.Design.DesignerActionList
    
    public class ColorLabelActionList :
              System.ComponentModel.Design.DesignerActionList
    
  2. İlişkili denetimin örneğini götüren Bu sınıf için bir kurucu ekleyin.Bu örneği başvurusu tutmak için özel bir alan sağlayın.Başvuru önbelleğe almak için özel bir alan da tedarik DesignerActionService.Bu listeyi güncelleştirmek için kullanılacaktır.

    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. Yöntemleri ve akıllı etiket öğeleri ilişkilendirmek istediğiniz özellikleri ekleyin.Karşılık gelen akıllı etiket girişinde seçildiğinde yöntemleri yürütülür.Bunların geçerli değerini görüntülenmesi için özellikleri alıcı bölümleri olmalıdır; İsteğe bağlı olarak kullanan ayarlayıcı bölümler de olabilir GetProperties değerlerine karşılık gelen akıllı etiket girdisinden düzenlenebilir olmasını ise yöntemi.

    [!NOT]

    Tasarım zamanı ortamı tamamında olduğu gibi bir özelliği yalnızca temel türlerinden biri tarafından sağlanıyorsa düzenlenmiş yeteneğine sahiptir.net Framework türü temel tür sağlanan tarafından dönüştürülebilir TypeConverter, ya da özel bir zaman UITypeEditor sağlanır.

    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. İsteğe bağlı olarak bir geçersiz kılınmış sürümünü uygulayan GetSortedActionItems yöntemi bir dizi dönmek için DesignerActionItem her öğenin bir özellik veya yöntem önceki adımda oluşturduğunuz ilişkili olduğu örnekleri.Öğelerin sırasını değiştirmek, bunları kategorilere veya isteğe bağlı olarak bunları göstermek için bunu yapabilirsiniz.Liste ayrıca mantıksal grup başlıkları gibi statik öğeler içerebilir.

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

ActionLists özellik uygulamak için tasarımcı ilişkilendirilmiş sınıf güncelleştirmek için

  1. Denetim için tasarımcı sınıfını bulun.Biri yoksa, tasarımcı bir sınıf oluşturmak ve denetim sınıfına ilişkilendirin.Tasarımcılar hakkında daha fazla bilgi için bkz: Temel Tasarımcı Sınıfları.

  2. Bir iyileştirme teknik bir özel alan türü ekleme DesignerActionListCollection.

    Private lists As DesignerActionListCollection
    
    private DesignerActionListCollection actionLists;
    
  3. Geçersiz kılınmış ekleme ActionLists yeni bir örneğini döndürmek için özelliği ColorLabelActionList daha önce oluşturduğunuz sınıf.

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

Comments

Birkaç alan kodunun daha ayrıntılı bir açıklama ediyorsun:

  • Bir özellik veya yöntem sınıfta türetilmiş ne zaman DesignerActionList durumu değiştiğinde ilişkili denetimin bu değişiklikleri bileşeninin özelliklerini doğrudan ayarlayıcı çağrıları tarafından yapılmaması gerekir.Bunun yerine, bu tür değişiklikler yapılmalıdır uygun şekilde oluşturulmuş aracılığıyla PropertyDescriptor.Bu dolaylı yaklaşım, akıllı etiket geri alma ve UI eylemleri işlevi doğru güncelleştirmenizi sağlar.

  • Akıllı etiket paneli çağrılarak dinamik olarak güncelleştirebilirsiniz DesignerActionUIService.Refresh.Bu işlem, akıllı etiketi panelin içeriğini dinamik olarak değiştirmek için kullanılabilir.Örnekte, renkleri değiştirme ile endişeniz akıllı etiketleri durumuna bağlı olarak koşullu olarak bulunan LockColors özelliği.Bu Boolean özelliği Geliştirici kilitleyebilir veya geçerli renk seçimi en az menü kilidini açmak için de Akıllı etiketle ilişkilidir.

  • Akıllı etiket giriş türü DesignerActionMethodItem isteğe bağlı olarak ilişkili denetimi için kısayol menüsünü ayarlayarak eklenebilir includeAsDesignerVerb yapıcısına parametresinde true..net Framework sonra örtük olarak oluşturur buna karşılık gelen DesignerVerb ve sizin için kısayol menüsüne ekler.Bu örnekte, InvertColors madde bu şekilde işlenir.

  • Akıllı etiket öğelerini bir panel tarafından gruplandırılır, Category kurucu her öğe için ayarlama özelliği.Bu özellik açıkça ayarlanmazsa, varsayılan kategori atanır.Her öğe akıllı etiket panelinde kategoriye göre ve sonra geçiş sırasına göre sipariş edilen DesignerActionItem sınıfı tarafından döndürülen array türetilen DesignerActionList sınıfı.Bu örnek iki kategori içerir: Appearance ve Information.

    [!NOT]

    Hayır DesignerActionHeaderItem ikinci kategori için sağlanır.

  • Statik metin bilgileri görüntüleyen bir giriş kullanılarak uygulanabilir bir DesignerActionTextItem veya bir DesignerActionPropertyItem , ilişkili özelliği yalnızca bir kurucu içerir.Bu örnek, önceki bir yaklaşım kullanır.

Sonraki Adımlar

Bileþeniniz tasarım ortamına tümleştirmek başladıktan sonra tasarımcı desteği genişletme düşünün.

Ayrıca bkz.

Başvuru

DesignerVerb

DesignerActionItem

DesignerActionList

ActionLists

DesignerActionService

Kavramlar

Windows Formları için Tasarımcı Komutları ve DesignerAction Nesne Modeli