如何:向 Windows 窗体组件附加智能标记
2007-03-20 08:23
363 查看
http://msdn2.microsoft.com/zh-cn/library/ms171830(VS.80).aspx
此示例演示如何向组件和自定义控件添加智能标记支持。
有关此代码示例的完整说明,请参见演练:向 Windows 窗体组件添加智能标记。
C#
DesignerActionItem
DesignerActionList
ActionLists
DesignerActionService
此示例演示如何向组件和自定义控件添加智能标记支持。
有关此代码示例的完整说明,请参见演练:向 Windows 窗体组件添加智能标记。
示例
Visual Basic'/////////////////////////////////////////////////////////////////// 'Pull model smart tag example. 'Need references to System.dll, System.Windows.Forms.dll, ' System.Design.dll, and System.Drawing.dll. '/////////////////////////////////////////////////////////////////// Imports System Imports System.Drawing Imports System.Collections Imports System.ComponentModel Imports System.ComponentModel.Design Imports System.Windows.Forms Imports System.Text Imports System.Reflection Namespace SmartTags Public Class Form1 Inherits System.Windows.Forms.Form Private colorLabel2 As ColorLabel Public Sub New() InitializeComponent() End Sub 'VS Forms Designer generated method Private Sub InitializeComponent() Me.colorLabel2 = New ColorLabel Me.SuspendLayout() ' 'colorLabel2 ' Me.colorLabel2.BackColor = System.Drawing.Color.FromArgb(CType(CType(255, Byte), Integer), CType(CType(165, Byte), Integer), CType(CType(0, Byte), Integer)) Me.colorLabel2.ColorLocked = False Me.colorLabel2.Font = New System.Drawing.Font("Arial", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.colorLabel2.Location = New System.Drawing.Point(41, 42) Me.colorLabel2.Name = "colorLabel2" Me.colorLabel2.Size = New System.Drawing.Size(117, 25) Me.colorLabel2.TabIndex = 0 Me.colorLabel2.Text = "ColorLabel" ' 'Form1 ' Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.Add(Me.colorLabel2) Me.Name = "Form1" Me.ResumeLayout(False) End Sub <STAThread()> _ Shared Sub Main() Dim f1 As New Form1() f1.ShowDialog() End Sub End Class '/////////////////////////////////////////////////////////////// 'ColorLabel is a simple extension of the standard Label control, ' with color property locking added. '/////////////////////////////////////////////////////////////// <Designer(GetType(ColorLabelDesigner))> _ Public Class ColorLabel Inherits System.Windows.Forms.Label Private colorLockedValue As Boolean = False Public Property ColorLocked() As Boolean Get Return colorLockedValue End Get Set(ByVal value As Boolean) colorLockedValue = value End Set End Property Public Overrides Property BackColor() As Color Get Return MyBase.BackColor End Get Set(ByVal value As Color) If ColorLocked Then Return Else MyBase.BackColor = value End If End Set End Property Public Overrides Property ForeColor() As Color Get Return MyBase.ForeColor End Get Set(ByVal value As Color) If ColorLocked Then Return Else MyBase.ForeColor = value End If End Set End Property End Class '/////////////////////////////////////////////////////////////// 'Designer for the ColorLabel control with support for a smart ' tag panel. '/////////////////////////////////////////////////////////////// 'Must add reference to System.Design.dll <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _ Public Class ColorLabelDesigner Inherits System.Windows.Forms.Design.ControlDesigner Private lists As DesignerActionListCollection 'Use pull model to populate smart tag menu. 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 End Class '/////////////////////////////////////////////////////////////// 'DesignerActionList-derived class defines smart tag entries and ' resultant actions. '/////////////////////////////////////////////////////////////// Public Class ColorLabelActionList Inherits System.ComponentModel.Design.DesignerActionList Private colLabel As ColorLabel Private designerActionUISvc As DesignerActionUIService = Nothing 'The constructor associates the control 'with the smart tag list. 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 'Helper method to retrieve control properties. Use of ' GetProperties enables undo and menu updates to work properly. Private Function GetPropertyByName(ByVal propName As String) _ As PropertyDescriptor Dim prop As PropertyDescriptor prop = TypeDescriptor.GetProperties(colLabel)(propName) If prop Is Nothing Then Throw New ArgumentException( _ "Matching ColorLabel property not found!", propName) Else Return prop End If End Function 'Properties that are targets of DesignerActionPropertyItem entries. Public Property BackColor() As Color Get Return colLabel.BackColor End Get Set(ByVal value As Color) GetPropertyByName("BackColor").SetValue(colLabel, value) End Set End Property 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 Property [Text]() As String Get Return colLabel.Text End Get Set(ByVal value As String) GetPropertyByName("Text").SetValue(colLabel, value) End Set End Property 'Method that is target of a DesignerActionMethodItem 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 'Implementation of this virtual method creates smart tag ' items, associates their targets, and collects into list. 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 End Class End Namespace
C#
///////////////////////////////////////////////////////////////////// // Pull model smart tag example. // Need references to System.dll, System.Windows.Forms.dll, // System.Design.dll, and System.Drawing.dll. ///////////////////////////////////////////////////////////////////// using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Windows.Forms; using System.Text; using System.Reflection; namespace SmartTags { public class Form1 : System.Windows.Forms.Form { private ColorLabel colorLabel2; public Form1() { InitializeComponent(); } // VS Forms Designer generated method private void InitializeComponent() { this.colorLabel2 = new SmartTags.ColorLabel(); this.SuspendLayout(); // // colorLabel2 // this.colorLabel2.BackColor = System.Drawing.Color.Gold; this.colorLabel2.ColorLocked = false; this.colorLabel2.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.colorLabel2.Location = new System.Drawing.Point(41, 42); this.colorLabel2.Name = "colorLabel2"; this.colorLabel2.Size = new System.Drawing.Size(117, 25); this.colorLabel2.TabIndex = 0; this.colorLabel2.Text = "colorLabel2"; // // Form1 // this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.colorLabel2); this.Name = "Form1"; this.ResumeLayout(false); } [STAThread] static void Main() { Form1 f1 = new Form1(); f1.ShowDialog(); } } ///////////////////////////////////////////////////////////////// // ColorLabel is a simple extension of the standard Label control, // with color property locking added. ///////////////////////////////////////////////////////////////// [Designer(typeof(ColorLabelDesigner))] public class ColorLabel : System.Windows.Forms.Label { private bool colorLockedValue = false; public bool ColorLocked { get { return colorLockedValue; } set { colorLockedValue = value; } } public override Color BackColor { get { return base.BackColor; } set { if (ColorLocked) return; else base.BackColor = value; } } public override Color ForeColor { get { return base.ForeColor; } set { if (ColorLocked) return; else base.ForeColor = value; } } } ///////////////////////////////////////////////////////////////// // Designer for the ColorLabel control with support for a smart // tag panel. // Must add reference to System.Design.dll ///////////////////////////////////////////////////////////////// [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] public class ColorLabelDesigner : System.Windows.Forms.Design.ControlDesigner { private DesignerActionListCollection actionLists; // Use pull model to populate smart tag menu. public override DesignerActionListCollection ActionLists { get { if (null == actionLists) { actionLists = new DesignerActionListCollection(); actionLists.Add( new ColorLabelActionList(this.Component)); } return actionLists; } } } ///////////////////////////////////////////////////////////////// // DesignerActionList-derived class defines smart tag entries and // resultant actions. ///////////////////////////////////////////////////////////////// public class ColorLabelActionList : System.ComponentModel.Design.DesignerActionList { private ColorLabel colLabel; private DesignerActionUIService designerActionUISvc = null; //The constructor associates the control //with the smart tag list. 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; } // Helper method to retrieve control properties. Use of // GetProperties enables undo and menu updates to work properly. private PropertyDescriptor GetPropertyByName(String propName) { PropertyDescriptor prop; prop = TypeDescriptor.GetProperties(colLabel)[propName]; if (null == prop) throw new ArgumentException( "Matching ColorLabel property not found!", propName); else return prop; } // Properties that are targets of DesignerActionPropertyItem entries. public Color BackColor { get { return colLabel.BackColor; } set { GetPropertyByName("BackColor").SetValue(colLabel, value); } } 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 String Text { get { return colLabel.Text; } set { GetPropertyByName("Text").SetValue(colLabel, value); } } // Method that is target of a DesignerActionMethodItem 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); } // Implementation of this abstract method creates smart tag // items, associates their targets, and collects into list. 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; } } }
编译代码
当您更改组件的设计时方面时,需要重新生成控件项目。此外,如果有另外一个 Windows 窗体项目当前处于打开状态并且使用此组件,您很可能将需要刷新该项目才能看到更改。一般情况下,需要关闭并重新打开包含组件的设计窗口。请参见
参考
DesignerVerbDesignerActionItem
DesignerActionList
ActionLists
DesignerActionService
概念
Windows 窗体的设计器命令和 DesignerAction 对象模型其他资源
扩展设计时支持相关文章推荐
- MSDN-如何向 Windows 窗体组件附加智能标记
- C# 如何:禁用 Windows 窗体 DataGridView 控件的按钮列中的按钮 Enable = false
- [windows编程] 如何利用句柄操作其他windows窗体
- 如何在 Azure 中标记 Windows 虚拟机
- XAF中如何自定义Windows窗体
- 如何取得窗体中的组件(Component) 列表
- 如何:对 Windows 窗体控件进行线程安全调用
- 如何:对 Windows 窗体控件进行线程安全调用
- c#中如何跨线程调用windows窗体控件
- 如何取得窗体中的组件(Component) 列表
- 如何解决“添加删除Windows组件”中没有IIS服务项
- 智能设备开发演练:创建用于设备的 Windows 窗体应用程序
- 如何:拉伸 ToolStripTextBox 以填充 ToolStrip 的其余宽度(Windows 窗体)
- k8s附加组件之UI-如何使用dashboard
- Windows窗体编程基础学习: 对话框组件
- [引]智能设备开发演练:创建用于设备的 Windows 窗体应用程序
- 组件编程(7) Component DesignerAction(智能标记)
- 如何跨线程调用Windows窗体控件
- 如何:对 Windows 窗体控件进行线程安全调用
- 如何:在 Windows 窗体 DataGridView 单元格中承载控件