#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 пикселей.