Переполнение ToolStrip - PullRequest
       8

Переполнение ToolStrip

1 голос
/ 25 октября 2008

Мне нужно заменить стандартную функцию переполнения в ToolStrip на кнопку «Еще ...», которая затем вызвала бы меню с переполненными элементами. У кого-нибудь есть идеи о том, как этого добиться?

Ответы [ 2 ]

2 голосов
/ 31 октября 2008

Я написал нечто очень похожее на это некоторое время назад. Код, который я использовал, вставлен ниже, и вы можете изменить его в соответствии со своими потребностями.

ToolStripCustomiseMenuItem - это, по сути, ваша кнопка «Дополнительно», которая при нажатии заполняет контекстное меню DropDown. Надеюсь, это поможет вам, по крайней мере, это должно быть хорошей отправной точкой ...

  public class ToolStripCustomiseMenuItem : ToolStripDropDownButton {
        public ToolStripCustomiseMenuItem()
            : base("Add Remove Buttons") {
            this.Overflow = ToolStripItemOverflow.Always;
            DropDown = CreateCheckImageContextMenuStrip();
        }

    ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip();
    internal ContextMenuStrip CreateCheckImageContextMenuStrip() {
        ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip();
        checkImageContextMenuStrip.ShowCheckMargin = true;
        checkImageContextMenuStrip.ShowImageMargin = true;
        checkImageContextMenuStrip.Closing += new ToolStripDropDownClosingEventHandler(checkImageContextMenuStrip_Closing);
        checkImageContextMenuStrip.Opening += new CancelEventHandler(checkImageContextMenuStrip_Opening);
        DropDownOpening += new EventHandler(ToolStripAddRemoveMenuItem_DropDownOpening);
        return checkImageContextMenuStrip;
    }

    void checkImageContextMenuStrip_Opening(object sender, CancelEventArgs e) {

    }

    void ToolStripAddRemoveMenuItem_DropDownOpening(object sender, EventArgs e) {
        DropDownItems.Clear();
        if (this.Owner == null) return;
        foreach (ToolStripItem ti in Owner.Items) {
            if (ti is ToolStripSeparator) continue;
            if (ti == this) continue;
            MyToolStripCheckedMenuItem itm = new MyToolStripCheckedMenuItem(ti);
            itm.Checked = ti.Visible;
            DropDownItems.Add(itm);
        }
    }

    void checkImageContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e) {
        if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) {
            e.Cancel = true;
        }
    }
}

internal class MyToolStripCheckedMenuItem : ToolStripMenuItem {
    ToolStripItem tsi;
    public MyToolStripCheckedMenuItem(ToolStripItem tsi)
        : base(tsi.Text) {
        this.tsi = tsi;
        this.Image = tsi.Image;
        this.CheckOnClick = true;
        this.CheckState = CheckState.Checked;
        CheckedChanged += new EventHandler(MyToolStripCheckedMenuItem_CheckedChanged);
    }

    void MyToolStripCheckedMenuItem_CheckedChanged(object sender, EventArgs e) {
        tsi.Visible = this.Checked;
    }

}
0 голосов
/ 25 октября 2008

Вы можете перехватить событие рисования на кнопке, вызвав

toolStrip1.OverflowButton.Paint += new PaintEventHandler(OverflowButton_Paint);

Что теоретически должно позволить вам сказать «Больше ...», но я не смог установить ширину кнопки переполнения равной (узкой) ширине по умолчанию.

Кроме того, другая идея заключалась в том, что вы можете перехватить VisibleChanged на кнопке OverflowButton, а затем вручную вставить кнопку разделения в панель инструментов. Сложно выяснить, куда поместить эту кнопку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...