Share via


İzlenecek yol: UI Tür Düzenleyicisini Uygulama

Bir kullanıcı arabirimi (UI) tür Düzenleyici uygulayarak karmaşık özellik türleri için özel bir tasarım zamanı deneyimi sağlayabilir.

Bu izlenecek yolda kendi UI türü düzenleyen özel bir tür için yazar ve düzenleme arabirimi kullanarak görüntülemek açıklar bir PropertyGrid.

Bu izlenecek yolda açıklandığı görevleri şunlardır:

  • Özel bir tür tanımlama.

  • Görünüm denetimi için UI türü düzenleyiciniz tanımlama.

  • Türetildiği sınıfı tanımlayan UITypeEditor.

  • Geçersiz kılma GetEditStyle bildirmek için yöntem PropertyGrid Düzenleyicisi düzenleyen Stil türü.

  • Geçersiz kılma EditValue kullanıcı arabirimi, kullanıcı girdi işleme ve değer atama yöntemi.

Tek bir liste olarak buradaki örneklerde kodu kopyalamak için bkz: Nasıl yapılır: Tasarım Zamanı Özelliklerinden Faydalanan Windows Formları Denetimi Oluşturma.

Ö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 nerede .NET Framework yüklenir.

Özel türü tanımlama

Özel UI türü düzenleyiciniz özel türünü görüntüler.Bu tür karmaşık veya basit olabilir.Bu izlenecek yolda, bir basit tür özel tasarım zamanı düzenleme davranışı ile tanımlarsınız.Bu tür adı verilen MarqueeLightShape, ve bir enum iki değerli Square ve Circle.

Özel numaralandırma türü tanımlamak için

  • Windows Forms denetiminin tanımı gövdesinde MarqueeLightShape türü.

    ' This defines the possible values for the MarqueeBorder 
    ' control's LightShape property. 
    Public Enum MarqueeLightShape
        Square
        Circle
    End Enum
    
    // This defines the possible values for the MarqueeBorder 
    // control's LightShape property. 
    public enum MarqueeLightShape
    {
        Square,
        Circle
    }
    

Görünüm denetimi tanımlama

Özel UI türü düzenleyicinizi kullanarak bir Windows Forms denetimi düzenleme arabirimi görüntüler.Bu denetim adlı LightShapeSelectionControl, ve onu türetildiği UserControl.Geçerli özellik değeri ve başvuru kurucusu alır IWindowsFormsEditorService.Görünüm denetimi kullanan CloseDropDown yöntemi IWindowsFormsEditorService bir seçimde kullanıcı tıklattığında açılan pencereyi kapatmak için.

Görünüm Denetimi tanımlamak için

  • Windows Forms denetiminin tanımı gövdesinde LightShapeSelectionControl denetim.

    ' This control provides the custom UI for the LightShape property 
    ' of the MarqueeBorder. It is used by the LightShapeEditor. 
    Public Class LightShapeSelectionControl
        Inherits System.Windows.Forms.UserControl
    
       Private lightShapeValue As MarqueeLightShape = MarqueeLightShape.Square
    
        Private editorService As IWindowsFormsEditorService
       Private squarePanel As System.Windows.Forms.Panel
       Private circlePanel As System.Windows.Forms.Panel
    
       ' Required designer variable. 
       Private components As System.ComponentModel.Container = Nothing 
    
    
       ' This constructor takes a MarqueeLightShape value from the 
       ' design-time environment, which will be used to display 
       ' the initial state. 
        Public Sub New( _
        ByVal lightShape As MarqueeLightShape, _
        ByVal editorService As IWindowsFormsEditorService)
            ' This call is required by the Windows.Forms Form Designer.
            InitializeComponent()
    
            ' Cache the light shape value provided by the  
            ' design-time environment. 
            Me.lightShapeValue = lightShape
    
            ' Cache the reference to the editor service. 
            Me.editorService = editorService
    
            ' Handle the Click event for the two panels.  
            AddHandler Me.squarePanel.Click, AddressOf squarePanel_Click
            AddHandler Me.circlePanel.Click, AddressOf circlePanel_Click
        End Sub 
    
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then 
    
                ' Be sure to unhook event handlers 
                ' to prevent "lapsed listener" leaks. 
                RemoveHandler Me.squarePanel.Click, AddressOf squarePanel_Click
                RemoveHandler Me.circlePanel.Click, AddressOf circlePanel_Click
    
                If (components IsNot Nothing) Then
                    components.Dispose()
                End If 
    
            End If 
            MyBase.Dispose(disposing)
        End Sub 
    
        ' LightShape is the property for which this control provides 
        ' a custom user interface in the Properties window. 
        Public Property LightShape() As MarqueeLightShape
    
            Get 
                Return Me.lightShapeValue
            End Get 
    
            Set(ByVal Value As MarqueeLightShape)
                If Me.lightShapeValue <> Value Then 
                    Me.lightShapeValue = Value
                End If 
            End Set 
    
        End Property 
    
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            MyBase.OnPaint(e)
    
            Dim gCircle As Graphics = Me.circlePanel.CreateGraphics()
            Try 
                Dim gSquare As Graphics = Me.squarePanel.CreateGraphics()
                Try 
                    ' Draw a filled square in the client area of 
                    ' the squarePanel control.
                    gSquare.FillRectangle( _
                    Brushes.Red, _
                    0, _
                    0, _
                    Me.squarePanel.Width, _
                    Me.squarePanel.Height)
    
                    ' If the Square option has been selected, draw a  
                    ' border inside the squarePanel. 
                    If Me.lightShapeValue = MarqueeLightShape.Square Then
                        gSquare.DrawRectangle( _
                        Pens.Black, _
                        0, _
                        0, _
                        Me.squarePanel.Width - 1, _
                        Me.squarePanel.Height - 1)
                    End If 
    
                    ' Draw a filled circle in the client area of 
                    ' the circlePanel control.
                    gCircle.Clear(Me.circlePanel.BackColor)
                    gCircle.FillEllipse( _
                    Brushes.Blue, _
                    0, _
                    0, _
                    Me.circlePanel.Width, _
                    Me.circlePanel.Height)
    
                    ' If the Circle option has been selected, draw a  
                    ' border inside the circlePanel. 
                    If Me.lightShapeValue = MarqueeLightShape.Circle Then
                        gCircle.DrawRectangle( _
                        Pens.Black, _
                        0, _
                        0, _
                        Me.circlePanel.Width - 1, _
                        Me.circlePanel.Height - 1)
                    End If 
                Finally
                    gSquare.Dispose()
                End Try 
            Finally
                gCircle.Dispose()
            End Try 
        End Sub 
    
        Private Sub squarePanel_Click( _
        ByVal sender As Object, _
        ByVal e As EventArgs)
    
            Me.lightShapeValue = MarqueeLightShape.Square
            Me.Invalidate(False)
            Me.editorService.CloseDropDown()
    
        End Sub 
    
    
        Private Sub circlePanel_Click( _
        ByVal sender As Object, _
        ByVal e As EventArgs)
    
            Me.lightShapeValue = MarqueeLightShape.Circle
            Me.Invalidate(False)
            Me.editorService.CloseDropDown()
    
        End Sub
    
    #Region "Component Designer generated code" 
    
        '/ <summary>  
        '/ Required method for Designer support - do not modify  
        '/ the contents of this method with the code editor. 
        '/ </summary> 
        Private Sub InitializeComponent()
            Me.squarePanel = New System.Windows.Forms.Panel
            Me.circlePanel = New System.Windows.Forms.Panel
            Me.SuspendLayout()
            '  
            ' squarePanel 
            '  
            Me.squarePanel.Location = New System.Drawing.Point(8, 10)
            Me.squarePanel.Name = "squarePanel" 
            Me.squarePanel.Size = New System.Drawing.Size(60, 60)
            Me.squarePanel.TabIndex = 2
            '  
            ' circlePanel 
            '  
            Me.circlePanel.Location = New System.Drawing.Point(80, 10)
            Me.circlePanel.Name = "circlePanel" 
            Me.circlePanel.Size = New System.Drawing.Size(60, 60)
            Me.circlePanel.TabIndex = 3
            '  
            ' LightShapeSelectionControl 
            '  
            Me.Controls.Add(squarePanel)
            Me.Controls.Add(circlePanel)
            Me.Name = "LightShapeSelectionControl" 
            Me.Size = New System.Drawing.Size(150, 80)
            Me.ResumeLayout(False)
        End Sub
    
    #End Region
    
    End Class
    
    // This control provides the custom UI for the LightShape property 
        // of the MarqueeBorder. It is used by the LightShapeEditor. 
        public class LightShapeSelectionControl : System.Windows.Forms.UserControl
        {
            private MarqueeLightShape lightShapeValue = MarqueeLightShape.Square;
            private IWindowsFormsEditorService editorService = null;
            private System.Windows.Forms.Panel squarePanel;
            private System.Windows.Forms.Panel circlePanel;
    
            // Required designer variable. 
            private System.ComponentModel.Container components = null;
    
            // This constructor takes a MarqueeLightShape value from the 
            // design-time environment, which will be used to display 
            // the initial state. 
            public LightShapeSelectionControl( 
                MarqueeLightShape lightShape,
                IWindowsFormsEditorService editorService )
            {
                // This call is required by the designer.
                InitializeComponent();
    
                // Cache the light shape value provided by the  
                // design-time environment. 
                this.lightShapeValue = lightShape;
    
                // Cache the reference to the editor service. 
                this.editorService = editorService;
    
                // Handle the Click event for the two panels.  
                this.squarePanel.Click += new EventHandler(squarePanel_Click);
                this.circlePanel.Click += new EventHandler(circlePanel_Click);
            }
    
            protected override void Dispose( bool disposing )
            {
                if( disposing )
                {
                    // Be sure to unhook event handlers 
                    // to prevent "lapsed listener" leaks.
                    this.squarePanel.Click -= 
                        new EventHandler(squarePanel_Click);
                    this.circlePanel.Click -= 
                        new EventHandler(circlePanel_Click);
    
                    if(components != null)
                    {
                        components.Dispose();
                    }
                }
                base.Dispose( disposing );
            }
    
            // LightShape is the property for which this control provides 
            // a custom user interface in the Properties window. 
            public MarqueeLightShape LightShape
            {
                get
                {
                    return this.lightShapeValue;
                }
    
                set
                {
                    if( this.lightShapeValue != value )
                    {
                        this.lightShapeValue = value;
                    }
                }
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint (e);
    
                using( 
                    Graphics gSquare = this.squarePanel.CreateGraphics(),
                    gCircle = this.circlePanel.CreateGraphics() )
                {   
                    // Draw a filled square in the client area of 
                    // the squarePanel control.
                    gSquare.FillRectangle(
                        Brushes.Red, 
                        0,
                        0,
                        this.squarePanel.Width,
                        this.squarePanel.Height
                        );
    
                    // If the Square option has been selected, draw a  
                    // border inside the squarePanel. 
                    if( this.lightShapeValue == MarqueeLightShape.Square )
                    {
                        gSquare.DrawRectangle( 
                            Pens.Black,
                            0,
                            0,
                            this.squarePanel.Width-1,
                            this.squarePanel.Height-1);
                    }
    
                    // Draw a filled circle in the client area of 
                    // the circlePanel control.
                    gCircle.Clear( this.circlePanel.BackColor );
                    gCircle.FillEllipse( 
                        Brushes.Blue, 
                        0,
                        0,
                        this.circlePanel.Width, 
                        this.circlePanel.Height
                        );
    
                    // If the Circle option has been selected, draw a  
                    // border inside the circlePanel. 
                    if( this.lightShapeValue == MarqueeLightShape.Circle )
                    {
                        gCircle.DrawRectangle( 
                            Pens.Black,
                            0,
                            0,
                            this.circlePanel.Width-1,
                            this.circlePanel.Height-1);
                    }
                }   
            }
    
            private void squarePanel_Click(object sender, EventArgs e)
            {
                this.lightShapeValue = MarqueeLightShape.Square;
    
                this.Invalidate( false );
    
                this.editorService.CloseDropDown();
            }
    
            private void circlePanel_Click(object sender, EventArgs e)
            {
                this.lightShapeValue = MarqueeLightShape.Circle;
    
                this.Invalidate( false );
    
                this.editorService.CloseDropDown();
            }
    
            #region Component Designer generated code
            /// <summary>  
            /// Required method for Designer support - do not modify  
            /// the contents of this method with the code editor. 
            /// </summary> 
            private void InitializeComponent()
            {
                this.squarePanel = new System.Windows.Forms.Panel();
                this.circlePanel = new System.Windows.Forms.Panel();
                this.SuspendLayout();
    //  
    // squarePanel 
    //  
                this.squarePanel.Location = new System.Drawing.Point(8, 10);
                this.squarePanel.Name = "squarePanel";
                this.squarePanel.Size = new System.Drawing.Size(60, 60);
                this.squarePanel.TabIndex = 2;
    //  
    // circlePanel 
    //  
                this.circlePanel.Location = new System.Drawing.Point(80, 10);
                this.circlePanel.Name = "circlePanel";
                this.circlePanel.Size = new System.Drawing.Size(60, 60);
                this.circlePanel.TabIndex = 3;
    //  
    // LightShapeSelectionControl 
    //  
                this.Controls.Add(this.squarePanel);
                this.Controls.Add(this.circlePanel);
                this.Name = "LightShapeSelectionControl";
                this.Size = new System.Drawing.Size(150, 80);
                this.ResumeLayout(false);
    
            }
            #endregion
    
    
        }
    

UI türü Düzenleyici sınıfını tanımlama

Öğesinden türetilmeli UI türü düzenleyicisinin davranışı uygulamak için UITypeEditor taban sınıfı.Bu sınıf adı verilen LightShapeEditor.

UI türü Düzenleyicisi sınıfı tanımlamak için

  1. Erişmesini .NET Framework System.Design derleme başvuran ve alma tasarım zamanı desteği System.Drawing.Design ve System.Windows.Forms.Design ad.Daha fazla bilgi için bkz. Nasıl yapılır: Tasarım Zamanı Desteğine Windows Formlarından Erişim.

  2. Pencere formları denetimin tanımı gövdesinde LightShapeEditor sınıfı.

    ' This class demonstrates the use of a custom UITypeEditor.  
    ' It allows the MarqueeBorder control's LightShape property 
    ' to be changed at design time using a customized UI element 
    ' that is invoked by the Properties window. The UI is provided 
    ' by the LightShapeSelectionControl class. 
    Friend Class LightShapeEditor
        Inherits UITypeEditor
    
    // This class demonstrates the use of a custom UITypeEditor.  
    // It allows the MarqueeBorder control's LightShape property 
    // to be changed at design time using a customized UI element 
    // that is invoked by the Properties window. The UI is provided 
    // by the LightShapeSelectionControl class. 
    internal class LightShapeEditor : UITypeEditor
    {
    

GetEditStyle yöntemi geçersiz kılma

GetEditStyle Yöntemi, hangi tür bir kullanıcı arabirimi, UI türü Düzenleyici uyguladığı tasarım ortamını gösterir.Olası değerler tanımlanır UITypeEditorEditStyle türü.LightShapeEditor Uygulayan bir DropDown UI türü Düzenleyicisi.

GetEditStyle yöntemi geçersiz kılmak için

  • İletinin gövdesinde, LightShapeEditor tanımı, geçersiz kılma GetEditStyle dönmek için yöntem DropDown.

    Public Overrides Function GetEditStyle( _
            ByVal context As System.ComponentModel.ITypeDescriptorContext) _
            As UITypeEditorEditStyle
                Return UITypeEditorEditStyle.DropDown
            End Function
    
    public override UITypeEditorEditStyle GetEditStyle(
    System.ComponentModel.ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }
    

EditValue yöntemi geçersiz kılma

EditValue Yöntemi tasarım ortamını ve özel türünüzü düzenleme için kullanılan kullanıcı arabirimi arasındaki etkileşim kurar.EditValue Yöntemi, görünüm denetimi veya kullanıcı düzenler değer kalıcı iletişim kutusu örneğini oluşturur.Kullanıcı bittiğinde düzenleme, EditValue yöntemi için tasarım ortamı değeri döndürür.

Görünüm denetimi gibi olması halinde LightShapeSelectionControl, EditValue yöntemine başvuru iletin IWindowsFormsEditorService görünümünü denetlemek için.Görünüm denetimi, kullanıcı bir değeri seçtiğinde kendisini kapatmak için bu başvuruyu kullanabilirsiniz.Form kendini kapatmak için bu bir kalıcı iletişim kutusu için gerekli değildir.

EditValue yöntemi geçersiz kılmak için

  • İletinin gövdesinde, LightShapeEditor tanımı, geçersiz kılma EditValue yöntemi.

    Public Overrides Function EditValue( _
    ByVal context As ITypeDescriptorContext, _
    ByVal provider As IServiceProvider, _
    ByVal value As Object) As Object 
        If (provider IsNot Nothing) Then
            editorService = _
            CType(provider.GetService(GetType(IWindowsFormsEditorService)), _
            IWindowsFormsEditorService)
        End If 
    
        If (editorService IsNot Nothing) Then 
            Dim selectionControl As _
            New LightShapeSelectionControl( _
            CType(value, MarqueeLightShape), _
            editorService)
    
            editorService.DropDownControl(selectionControl)
    
            value = selectionControl.LightShape
        End If 
    
        Return value
    End Function
    
    public override object EditValue(
        ITypeDescriptorContext context,
        IServiceProvider provider,
        object value)
    {
        if (provider != null)
        {
            editorService =
                provider.GetService(
                typeof(IWindowsFormsEditorService))
                as IWindowsFormsEditorService;
        }
    
        if (editorService != null)
        {
            LightShapeSelectionControl selectionControl =
                new LightShapeSelectionControl(
                (MarqueeLightShape)value,
                editorService);
    
            editorService.DropDownControl(selectionControl);
    
            value = selectionControl.LightShape;
        }
    
        return value;
    }
    

PaintValue yöntemi geçersiz kılma

Grafik gösterimi, özelliğin değeri geçersiz kılarak sağlar PaintValue yöntemi.

PaintValue yöntemi geçersiz kılmak için

  • İletinin gövdesinde, LightShapeEditor tanımı, geçersiz kılma PaintValue yöntemi.Ayrıca geçersiz kılma GetPaintValueSupported dönmek için yöntem true.

    ' This method indicates to the design environment that 
    ' the type editor will paint additional content in the 
    ' LightShape entry in the PropertyGrid. 
    Public Overrides Function GetPaintValueSupported( _
    ByVal context As ITypeDescriptorContext) As Boolean 
    
        Return True 
    
    End Function 
    
    ' This method paints a graphical representation of the  
    ' selected value of the LightShpae property. 
    Public Overrides Sub PaintValue( _
    ByVal e As PaintValueEventArgs)
    
        Dim shape As MarqueeLightShape = _
        CType(e.Value, MarqueeLightShape)
        Using p As Pen = Pens.Black
    
            If shape = MarqueeLightShape.Square Then
    
                e.Graphics.DrawRectangle(p, e.Bounds)
    
            Else
    
                e.Graphics.DrawEllipse(p, e.Bounds)
    
            End If 
    
        End Using 
    
    End Sub
    
    // This method indicates to the design environment that 
    // the type editor will paint additional content in the 
    // LightShape entry in the PropertyGrid. 
    public override bool GetPaintValueSupported(
        ITypeDescriptorContext context)
    {  
        return true;
    }
    
    // This method paints a graphical representation of the  
    // selected value of the LightShpae property. 
    public override void PaintValue(PaintValueEventArgs e)
    {   
        MarqueeLightShape shape = (MarqueeLightShape)e.Value;
        using (Pen p = Pens.Black)
        {
            if (shape == MarqueeLightShape.Square)
            {
                e.Graphics.DrawRectangle(p, e.Bounds);
            }
            else
            {
                e.Graphics.DrawEllipse(p, e.Bounds);
            }
        }   
    }
    

UI türü düzenleyen bir özellik ekleme

UI türü düzenleyen özel denetimi kullanmak için hazır olduğunda ekleme LightShapeEditor temel özelliği, özellik uygulamak MarqueeLightShape yazın ve Uygula EditorAttribute özelliğine.

UI türü düzenleyen bir özellik eklemek için

  • Denetimini denetimin tanımı gövdesi içinde bildirdiğiniz bir MarqueeLightShape adlı bir özellik LightShape.Ayrıca adlı bir oluşum alanı bildirmek lightShapeValue türü MarqueeLightShape özelliği yedeklemek için.Uygulama EditorAttribute özelliğine.
Private lightShapeValue As MarqueeLightShape

<Category("Marquee"), _
Browsable(True), _
EditorAttribute(GetType(LightShapeEditor), _
GetType(System.Drawing.Design.UITypeEditor))> _
Public Property LightShape() As MarqueeLightShape
    Get
        Return Me.lightShapeValue
    End Get
    Set(ByVal value As MarqueeLightShape)
        Me.lightShapeValue = value
    End Set
End Property
private MarqueeLightShape lightShapeValue;

[Category("Marquee")]
[Browsable(true)]
[EditorAttribute(typeof(LightShapeEditor),
typeof(System.Drawing.Design.UITypeEditor))]
public MarqueeLightShape LightShape
{
    get
    {
        return this.lightShapeValue;
    }

    set
    {
        this.lightShapeValue = value;
    }
}

UI türü Düzenleyicisi sınanıyor

Özel denetimi örneğini oluşturma ve eklemeyi UI türü düzenleyiciniz test edebilirsiniz bir PropertyGrid kullanarak kontrol SelectedObject özelliği.

Visual Studio kullanıyorsanız, yeni bir Windows Application projesi oluşturun, denetimin derleme başvurusu ve denetimi örneğini forma ekleyin.Bu görev için kapsamlı destek Visual Studio.Walkthrough: Automatically Populating the Toolbox with Custom Components

Tasarım zamanında özelliklerini denetlemek için görüntülendiğinde seçebilirsiniz LightShape özelliği.Bu seçildiğinde, aşağı açılan oku (Aşağı ok Özellikler penceresi) görünür.OK dümesini tıkladıınızda görünüm denetimi özellik girdisi görüntülenir.Daire veya kare değeri seçmek için tıklatın.' İ, görünüm denetimi kendisini terkeder ve seçtiğiniz değeri görünür sonra PropertyGrid.

[!NOT]

Özel geliştirmek ne zaman UITypeEditor, her yapı ile artırmak için yapı numarası olarak ayarlamanız önerilir.Bu eski, önbelleğe alınmış sürümlerini önler, UITypeEditor tasarım ortamında oluşturulan gelen.

Sonraki Adımlar

Kendi kullanıcı Arabirimi tür Düzenleyici yazılmış bir kez tablolarla etkileşim sağlamak için diğer yollarını keşfetmek bir PropertyGrid ve tasarım ortamı:

Ayrıca bkz.

Görevler

Nasıl yapılır: Tasarım Zamanı Özelliklerinden Faydalanan Windows Formları Denetimi Oluşturma

Başvuru

UITypeEditor

EditorAttribute

PropertyGrid

Diğer Kaynaklar

Kullanıcı Arabirimi Tür Düzenleyicileri