Как изменить высоту элемента в контрольном списке, чтобы текст элемента не обрезался? - PullRequest
0 голосов
/ 08 апреля 2020

Когда я создаю контрольный список на форме и заполняю y, g, et c. получить отсечение по следующему пункту. Я нашел похожие вопросы, на которые были даны ответы в течение многих лет a go ( Как изменить вертикальное пространство элемента CheckedListBox ) и пытался внедрить их исправления, но недостаточно подробностей, чтобы их решить.

Правильно Теперь я go добавить -> новый элемент -> класс и добавить класс к моему решению. Класс выглядит следующим образом

using System.Windows.Forms;

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

И объект появляется в моем наборе инструментов как this.

, но как только я перетаскиваю его в форму, он дает мне это enter image description here

Если кто-то может указать, что я делаю неправильно, это было бы очень полезно. Это разочаровало меня до бесконечности. Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

К сожалению, Visual Studio 2017 (2019?) все еще не очень хорошо работает с 64-битными элементами управления в панели инструментов. В первую очередь это связано с тем, что VS является 32-разрядным приложением.

Обычное решение - создать проект, содержащий ваши пользовательские элементы управления для платформы «Любой процессор». Это может даже означать создание отдельного проекта библиотеки классов для их размещения.

Быстрое и простое (субъективное) решение состоит в добавлении пользовательских элементов управления в код 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 - свойство только для чтения, которое возвращает Font.Height + scaledListItemBordersHeight.

0 голосов
/ 08 апреля 2020

[Обновлено комментарием ОП]
Если вам нужно унаследовать некоторый класс, вот вам шаг.

  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, вы можете увидеть время его разработки, как показано на рисунке ниже. enter image description here

Если родительский класс необходимо инициализировать, дочерний класс должен добавить base() в конструктор вашего класса.
И базовая c идея для дизайна время действия от Здесь

//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;
        }
    }
}

...