如何更改清单框中的项目高度以使项目文本不被截断?

How can I change the Item Height in a checklistbox so the item text is not cut-off?

当我在表单上创建一个清单框并填充 y、g 等时,被下一项截断。 我发现了多年前回答的类似问题 (How to change CheckedListBox item vertical space) 并尝试实施他们的修复,但没有足够的细节来解决它。

现在,我去添加 -> 新项目 -> class 并在我的解决方案中添加一个 class。 class 看起来像这样

using System.Windows.Forms;

namespace Test_GUI
{
    public sealed class MyListBox : CheckedListBox
    {
        public MyListBox()
        {
            ItemHeight = 30;
        }
        public override int ItemHeight { get; set; }
    }
}

对象出现在我的工具箱中 this.

但是一旦我将它拖放到表单中,它就会给我这个

如果有人能指出我做错了什么,那将是一个很大的帮助。这让我很沮丧。谢谢!

[根据 OP 的评论更新]
如果您需要继承一些 class,这里是适合您的步骤。

  1. 将用户控件添加到您的项目
    右键单击您的项目 -> 添加 -> 用户控件。 Visual studio 将创建 2 个文件。
    (UserControl.cs 和 UserControl.Designer.cs)
  2. 基本上当你创建用户控件时,它继承自UserControl
    所以将其更改为 CheckedListBox.
  3. 在构造函数中添加 : base(),如下所示。
  4. 删除行以防止编译错误。
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    UserControl.Designer.cs.
  5. 添加一些属性,如果你设置它public你可以在设计时看到它,如下图。

如果父 class 需要初始化,子 class 应该在 class.
的构造函数中添加 base() 以及来自 Here

的设计时操作的基本思想
//Change parent class UserControl --> CheckedListBox.
//public partial class MyListBox : UserControl  
public partial class MyListBox : CheckedListBox
{
    /*
        Add base() in your constructor.
    */
    public MyListBox() : base()
    {  
        InitializeComponent();
    }

    // Add some properties.
    private int _ItemHeightOffSet = 0;

    public int ItemHeightOffSet {
        get { return _ItemHeightOffSet; } 
        set { 
            this._ItemHeightOffSet = value;

            /*
               This will help you adjust height in design time.
               When 'DesignMode' is true  --> Control loaded at Visual Studio. : Design time.
               When 'DesignMode' is false --> Control loaded at debuging or running. : Run time.
            */
            if (DesignMode == true)
            {
                base.ItemHeight = value + ItemHeightOffSet;
                base.Refresh();
            }
        } 
    }

    public override int ItemHeight
    {
        get { 
            return base.ItemHeight + ItemHeightOffSet; 
        }
        set
        {
            base.ItemHeight = value + ItemHeightOffSet;
        }
    }
}

不幸的是 Visual Studio 2017(2019?)仍然 不能很好地与工具箱中的 64 位控件一起使用。这主要是因为 VS 是一个 32 位应用程序。

正常的解决方案是为 "Any CPU" 平台构建包含自定义控件的项目。这甚至可能意味着创建一个单独的 Class 图书馆项目来容纳它们。

快速简便的解决方案(主观)是将您的自定义控件添加到代码中的 Form 并避开设计器。

如果更改 ItemHeight 唯一 创造性的事情,我将提供一个使用标准 CheckedListBox 控制和反射的解决方法.

在您的 Form 构造函数中,InitializeComponent(); 之后,执行以下操作:

var heightField = typeof(CheckedListBox).GetField(
    "scaledListItemBordersHeight", 
    BindingFlags.NonPublic | BindingFlags.Instance
);

var addedHeight = 10; // Some appropriate value, greater than the field's default of 2

heightField.SetValue(clb, addedHeight); // Where "clb" is your CheckedListBox

这需要:

using System.Reflection;

之所以可行,是因为在内部,ItemHeight 是 returns Font.Height + scaledListItemBordersHeight.

的只读 属性