You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义PictureBox控件:如何在属性网格Alphabetized模式下保持属性分组?

实现自定义属性在Alphabetized模式下保持分组的方案

要让自定义属性像PictureBox的Location那样,在属性网格的**Alphabetized(按字母排序)**模式下仍保持分组,核心是把相关属性封装成一个可展开的自定义类型,而非单独的独立属性。具体实现步骤如下:

1. 创建封装Border属性的自定义类

先定义一个包含所有Border相关属性的类,为每个属性添加分类和描述特性:

Imports System.ComponentModel

Public Class BorderSettings
    Private _borderSize As Integer = 1
    Private _borderColor As Color = Color.Black
    Private _borderColor2 As Color = Color.Gray

    <Category("Border"), Description("Border Size")>
    Public Property BorderSize As Integer
        Get
            Return _borderSize
        End Get
        Set(ByVal value As Integer)
            _borderSize = Math.Max(0, value) ' 确保尺寸非负
        End Set
    End Property

    <Category("Border"), Description("Border Color")>
    Public Property BorderColor As Color
        Get
            Return _borderColor
        End Get
        Set(ByVal value As Color)
            _borderColor = value
        End Set
    End Property

    <Category("Border"), Description("Border Color2")>
    Public Property BorderColor2 As Color
        Get
            Return _borderColor2
        End Get
        Set(ByVal value As Color)
            _borderColor2 = value
        End Set
    End Property
End Class

2. 修改自定义PictureBox控件

将原来的三个独立属性替换为上面定义的BorderSettings类型属性,并通过TypeConverter特性指定ExpandableObjectConverter,让属性网格识别为可展开的分组:

Imports System.ComponentModel
Imports System.Windows.Forms

Public Class CustomPictureBox
    Inherits PictureBox

    Private _borderSettings As New BorderSettings()

    <Category("Border"), Description("Border related settings"),
     TypeConverter(GetType(ExpandableObjectConverter))>
    Public Property BorderSettings As BorderSettings
        Get
            Return _borderSettings
        End Get
        Set(ByVal value As BorderSettings)
            _borderSettings = value
            Invalidate() ' 修改后触发控件重绘
        End Set
    End Property

    ' 可选:重写OnPaint实现边框绘制逻辑
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        MyBase.OnPaint(e)
        If _borderSettings.BorderSize > 0 Then
            ' 示例:绘制双层边框
            Using pen1 As New Pen(_borderSettings.BorderColor, _borderSettings.BorderSize)
                e.Graphics.DrawRectangle(pen1, New Rectangle(0, 0, Width - 1, Height - 1))
            End Using
            If _borderSettings.BorderSize > 1 Then
                Using pen2 As New Pen(_borderSettings.BorderColor2, _borderSettings.BorderSize - 1)
                    e.Graphics.DrawRectangle(pen2, New Rectangle(1, 1, Width - 3, Height - 3))
                End Using
            End If
        End If
    End Sub
End Class

效果说明

  • 在**Categorized(分类)**模式下,BorderSettings会显示在"Border"分类下,点击可展开查看所有子属性。
  • 在**Alphabetized(按字母排序)**模式下,BorderSettings作为单个属性条目存在,点击展开后仍能看到所有Border相关子属性,实现和Location一致的分组效果。

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:07:52