如何更改清单框中的项目高度以使项目文本不被截断?
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,这里是适合您的步骤。
- 将用户控件添加到您的项目
右键单击您的项目 -> 添加 -> 用户控件。 Visual studio 将创建 2 个文件。
(UserControl.cs 和 UserControl.Designer.cs)
- 基本上当你创建用户控件时,它继承自
UserControl
。
所以将其更改为 CheckedListBox
.
- 在构造函数中添加
: base()
,如下所示。
- 删除行以防止编译错误。
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
在 UserControl.Designer.cs
.
- 添加一些属性,如果你设置它
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
.
的只读 属性
当我在表单上创建一个清单框并填充 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,这里是适合您的步骤。
- 将用户控件添加到您的项目
右键单击您的项目 -> 添加 -> 用户控件。 Visual studio 将创建 2 个文件。
(UserControl.cs 和 UserControl.Designer.cs) - 基本上当你创建用户控件时,它继承自
UserControl
。
所以将其更改为CheckedListBox
. - 在构造函数中添加
: base()
,如下所示。 - 删除行以防止编译错误。
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
在UserControl.Designer.cs
. - 添加一些属性,如果你设置它
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
.