Текст ToolStripButton обрезается в ContextMenuStrip - PullRequest
3 голосов
/ 11 октября 2009

Я создаю свой экземпляр 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?

Ответы [ 6 ]

3 голосов
/ 07 апреля 2014

После некоторого рефакторинга ранее работавшей реализации контекстного меню я столкнулся с той же проблемой.Как и @PeteBaughman, я не смог исправить это, изменив ContextMenuStrip.Width - ширина фактически не изменилась (также ContextMenuStrip.MaximumSize не было указано: (0,0)).

Добавление невидимого элемента какПит предложил сделать свое дело.После еще нескольких экспериментов я нашел другой обходной путь : вызов ContextMenuStrip.PerformLayout() привел к ожидаемому поведению.

(вызов SuspendLayout и ResumeLayout до и после добавления элементовне сработало.)


Обновление: Реальная проблема может заключаться в том, что ToolStripButton добавляется к ContextMenuStrip, который обычно вызывает ToolStripMenuItem при вызовевот так:

contextMenuStrip.Items.Add("Hello world"); // Returns a ToolStripMenuItem

Мне удалось пропустить вызов на PerformLayout() после создания элементов правильного вида.

3 голосов
/ 11 октября 2009

Любопытный; Я могу воспроизвести это ... очень странно (для меня), что установка меню .Width исправляет его ... но установка на что-либо (кажется, полностью игнорирует значение):

layoutMenus.Width = 800; // could be 20, or 100 and would appear the same

Посмотри, работает ли это. Это для меня, хотя это не имеет никакого смысла.

Даже

layoutMenus.Width++;
layoutMenus.Width--;

оставляет достаточно места, но

layoutMenus.Width = layoutMenus.Width;

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

2 голосов
/ 03 августа 2012

2 года спустя я столкнулся с той же проблемой. У меня не был установлен MaxSize, и касание свойства Width тоже не помогло. Мой ContextMenuStrip содержал только один элемент - серую кнопку с надписью «Не поддерживается». Он был усечен до "Не поддерживает".

В итоге мне пришлось добавить фиктивный элемент в конец ContextMenuStrip и установить его видимость на False. Затем ContextMenuStrip был достаточно широким, чтобы показать первый элемент, который я действительно хотел показать.

Ссылка здесь

1 голос
/ 30 ноября 2010

У меня такая же проблема. Перепробовал все эти вещи, и оказалось, что MaxSize установлен по ошибке, как (200, 0). Сбросьте его до (0,0), чтобы устранить проблему.

0 голосов
/ 22 мая 2019

У меня похожая проблема. Я хочу добавить флажок в список пунктов меню. Для этого мне нужно добавить флажок в ToolStripControlHost, а затем добавить ToolStripControlHost в объект ToolStripMenuItem. Имя последнего флажка всегда усекается на 3 символа. Мое решение состоит в том, чтобы переключить Авторазмер последнего узла элемента, как показано ниже:

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 должно быть сделано после добавления элемента хоста в список.

0 голосов
/ 08 мая 2019

Чтобы добавить немного деталей к симптому: в моем случае проблема возникает только тогда, когда в контекстном меню есть только один элемент. С несколькими элементами ширина, кажется, установлена ​​правильно.

И звонок ContextMenuStrip.PerformLayout исправил это для меня.

...