Текст 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 должен быть выполнен после того, как ведущий элемент добавлен в список.

Другие вопросы по тегам