Текст ToolStripButton обрезается в ContextMenuStrip
Я создаю свою собственную ToolStripButton
и добавив его в ContextMenuStrip
, Он появляется, но текст обрезается:
string[] layouts = new string[]{"Test 1", "Test 2", "Test 3"};
List<ToolStripButton> items = new List<ToolStripButton>();
foreach (string layout in layouts)
{
ToolStripButton item = new ToolStripButton(layout, image, LayoutClicked);
item.AutoSize = true;
items.Add(item);
}
layoutMenus.Items.Clear();
layoutMenus.Items.AddRange(items.ToArray());
layoutMenus.Show(Cursor.Position.X, Cursor.Position.Y);
Любая идея, почему текст обрезается как AutoSize
свойство true
?
4 ответа
Любопытный; Я могу воспроизвести это... очень странно (для меня), что установка меню .Width
исправляет это... но устанавливает его на что-либо (кажется, полностью игнорирует значение):
layoutMenus.Width = 800; // could be 20, or 100 and would appear the same
Посмотри, работает ли это. Это для меня, хотя это не имеет никакого реального смысла.
Четное:
layoutMenus.Width++;
layoutMenus.Width--;
оставляет достаточно места, но
layoutMenus.Width = layoutMenus.Width;
не делает этого (предположительно, он проверяет отсутствие изменений и игнорирует любые побочные эффекты, описанные выше).
После некоторого рефакторинга ранее работающей реализации контекстного меню я столкнулся с той же проблемой. Как и @PeteBaughman, я не смог исправить это, изменив ContextMenuStrip.Width
- ширина фактически не изменилась (также ContextMenuStrip.MaximumSize
не было уточнено: (0,0)
).
Добавление невидимого предмета, как предположил Пит, сработало. После нескольких экспериментов я нашел другой обходной путь: призыв к ContextMenuStrip.PerformLayout()
привело к ожидаемому поведению.
(Calling SuspendLayout
а также ResumeLayout
до и после добавления пунктов не получалось.)
Обновление: реальная проблема может быть в том, что ToolStripButton
добавляется в ContextMenuStrip
который обычно создает ToolStripMenuItem
когда вызывается так:
contextMenuStrip.Items.Add("Hello world"); // Returns a ToolStripMenuItem
Я смог опустить звонок PerformLayout()
после создания предметов правильного вида.
Через 2 года я столкнулся с той же проблемой. У меня не был установлен MaxSize, и касание свойства Width тоже не помогло. Мой ContextMenuStrip содержал только один элемент - серую кнопку с надписью "Не поддерживается". Это было сокращено до "Не Supp".
В итоге мне пришлось добавить фиктивный элемент в конец ContextMenuStrip и установить его видимость в False. Затем ContextMenuStrip был достаточно широким, чтобы показать первый элемент, который я действительно хотел показать.
Ссылка здесь
У меня та же проблема. Перепробовал все эти вещи, и оказалось, что MaxSize
устанавливается по ошибке, как (200, 0)
, Сбросить до (0,0)
решить проблему.
Чтобы добавить немного подробностей к симптому: в моем случае кажется, что проблема возникает только тогда, когда в контекстном меню есть только один элемент. При использовании нескольких элементов ширина кажется установленной правильно.
И звонит ContextMenuStrip.PerformLayout
исправил это для меня.
У меня похожая проблема. Я хочу добавить флажок в список пунктов меню. Для этого мне нужно добавить флажок в ToolStripControlHost, а затем добавить ToolStripControlHost в объект ToolStripMenuItem. Имя последнего флажка всегда обрезается на 3 символа. Мое решение - переключить AutoSize последнего узла элемента, как показано ниже:
Dim chkbox As System.Windows.Forms.CheckBox = New System.Windows.Forms.CheckBox()
chkbox.Text = "xxxxx"
Dim tshost As ToolStripControlHost = New ToolStripControlHost(chkbox)
tsmiAssemblySpecificTools.DropDownItems.Add(tshost)
tshost.AutoSize = False
tshost.AutoSize = True
Переключатель AutoSize должен быть выполнен после того, как ведущий элемент добавлен в список.