Изменение размера и сворачивание метки в winforms

#c# #.net #winforms #label #resize

Вопрос:

плакат для первого раза, извините, если что-то не так, как должно быть.

Я новичок в Winforms и пытаюсь создать простое приложение, которое будет отображать несколько функций элемента (например, размер, состав и т.д.). Каждая характеристика имеет имя, может иметь описание, а некоторые могут иметь подхарактеристики (также имеющие имя, а иногда и описание).

Я хочу отобразить их один под другим, с названием функции на синем фоне, занимающем всю ширину контейнера, с описанием внизу. Имя будет (или будет иметь) кнопку (или аналогичную), которая при нажатии сворачивает или разворачивает описание. Это должно быть создано во время выполнения, потому что я не знаю, сколько функций имеет объект, пока пользователь его не сгенерирует.

Проблемы, с которыми я сталкиваюсь, заключаются в том, что либо я не могу охватить синий фон по всей ширине контейнера (при использовании панели FlowLayoutPanel), либо у меня возникли проблемы с текстом описания неправильного размера (либо он обертывается, но слишком большой, либо он не обертывается, и тогда я не могу видеть весь текст).

Некоторые вещи исправлены, в основном количество основных разделов (например, размер, состав, Погода и т.д.), Поэтому я могу подготовить скелет до выполнения. Самое близкое, что я мог сделать, чтобы это сработало, дает это. Эта проблема здесь заключается в том, что высота панели, в которую встроена метка описания, фиксирована, и если я введу авторазмер, текст не будет отображаться (вероятно, потому, что метка выполнена в стиле док-станции заливки). Так же, как информация, это то, как это выглядит, когда свернуто (это действительно то, что я ищу)

Я знаю, что существует некоторая библиотека со складными панелями, но я бы предпочел, чтобы она работала без внешних библиотек. Заранее спасибо за любую помощь !

Это код, который выдает результаты на скриншотах :

         Panel SizeDescrPanel = new Panel();
        SizeDescrPanel.Dock = DockStyle.Top;
        //SizeDescrPanel.AutoSize = true;
        SizeDescrPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
        SizeDescrPanel.BackColor = Color.Bisque;
        SizePanel.Controls.Add(SizeDescrPanel);

        Label SizeDescrLbl = new Label();
        SizeDescrLbl.Text = Lorem;
        SizeDescrLbl.AutoSize = false;
        SizeDescrLbl.Dock = DockStyle.Fill;
        SizeDescrLbl.BackColor = Color.BurlyWood;
        SizeDescrPanel.Controls.Add(SizeDescrLbl);

        /*using(Graphics g = CreateGraphics())
        {
            SizeF size = g.MeasureString(SizeDescrLbl.Text, SizeDescrLbl.Font, SizePanel.Width);
            SizeDescrPanel.Height = (int) Math.Ceiling(size.Height);
        }*/

        Panel SizeNamePanel = new Panel();
        SizeNamePanel.Dock = DockStyle.Top;
        SizeNamePanel.BackColor = Color.Cyan;
        SizeNamePanel.AutoSize = true;
        SizePanel.Controls.Add(SizeNamePanel);

        Button SizeNameBtn = new Button();
        SizeNameBtn.Text = "<Size Name> ..."   SizeDescrLbl.Height;
        SizeNameBtn.TextAlign = ContentAlignment.MiddleLeft;
        SizeNameBtn.FlatStyle = FlatStyle.Flat;
        SizeNameBtn.AutoSize = true;
        SizeNamePanel.Controls.Add(SizeNameBtn);

        SizeNameBtn.Click  = delegate { HideShowPanel(SizeDescrPanel); };
 

Это тестовый проект,поэтому позже я применю к нему другие методы. Что здесь не показано :

  • У меня есть главная панель, которую нужно заполнить, содержащая все.
  • Текст «РАЗМЕР» — это метка, установленная сверху
  • Под ним находится другая панель (SizePanel) , для которой установлено значение «Сверху», а значение «Авторазмер» равно True. Это панель, внутри которой я помещаю свое имя размера и описание моего размера. Если бы у меня была подфона, она была бы включена (в идеале) в описание с той же конфигурацией (кнопка расширения/сворачивания описания подфона)

Комментарии:

1. Вы можете получить размер, необходимый для отображения текста (при заданном размере шрифта и ширине) с помощью одной из функций measuretext и/или measurestring. Однако мы не можем сказать, что идет не так, не увидев хотя бы часть вашего кода..

2. Спасибо за ваш ответ ! Как показано в коде, который я добавил, я попытался использовать функцию MeasureString, и это вроде как сработало, но только если я не изменяю размер окна. В любом случае, чтобы попытаться использовать это и, я думаю, запускать его каждый раз, когда размер окна изменяется ?

3. Это звучит так, как будто вы не хотите SizeNameBtn.AutoSize = true; , так как вы хотите охватить всю ширину. Это звучит так, как будто ты действительно хочешь SizeDescrLbl.AutoSize = true; . Попробуйте настроить MaximumSize.Width свойство, чтобы получить правильный перенос слов.

4. Да, если изменение размера изменяет целевую ширину, вам нужно будет адаптировать размеры и повторить измерение..

5. Почему бы вам не создать пользовательский элемент управления, содержащий всю логику, необходимую для расширения/свертывания дочернего элемента управления? Вы просто добавляете один пользовательский элемент управления для каждого элемента, проблема решена. — Обратите внимание , что в конечном итоге вы можете установить минимальный / максимальный размер метки, которая имеет AutoSize = true размер клиента контейнера. Кроме того, вы можете задать эти свойства, например, [Label].MinimumSize = new Size(200, 0) как , который ограничивает ширину, но не высоту, поэтому элемент управления будет расширяться только вниз, когда будет достигнута максимальная ширина 200 пикселей.