İ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
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
İ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; }
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); }
İ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
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ı.
Bir iyileştirme teknik bir özel alan türü ekleme DesignerActionListCollection.
Private lists As DesignerActionListCollection
private DesignerActionListCollection actionLists;
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.
Tasarım zamanı ortamı ile iletişimi kolaylaştırmak için üyelerinizin öznitelikleri ekleyin.Daha fazla bilgi için bkz. Windows Forms Denetimlerindeki Öznitelikler.
Kendi özel Tasarımcısı yazın.Daha fazla bilgi için bkz. Nasıl yapılır: Tasarım Zamanı Özelliklerinden Faydalanan Windows Formları Denetimi Oluşturma.
Ayrıca bkz.
Başvuru
Kavramlar
Windows Formları için Tasarımcı Komutları ve DesignerAction Nesne Modeli