Kevin Brady Ответов: 1

Отключить контекстное меню по умолчанию


Я создал пользовательский выпадающий список toolstrip, чтобы он отображал контекстное меню. Вот этот код.
Option Strict Off
Option Explicit On

<System.ComponentModel.Description("Custom Control to add a context menu to a toolstrip combobox")> _
Public Class MyToolStripComboBox
    Inherits Forms.ToolStripComboBox
    Private mContextMenu As ContextMenuStrip
    ' allows a context menu to be added to a toolstrip combobox control
    Public Property ContextMenuStrip() As ContextMenuStrip
        Get
            Return mContextMenu
        End Get
        Set(ByVal iConMenu As ContextMenuStrip)
            mContextMenu = iConMenu
        End Set
    End Property

    Protected Overrides Sub OnMouseDown(e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e)
        If e.Button = MouseButtons.Right Then
            If mContextMenu IsNot Nothing Then
                Dim iBounds = Me.Bounds
                Dim iParLoc As Point = Parent.Location
                Dim iPt As Point = iParLoc
                iPt.X += iBounds.Left
                iPt.Y += iBounds.Bottom
                mContextMenu.Show(Parent.PointToScreen(iPt))
            End If
        End If

    End Sub
End Class


Он работает нормально, за исключением того, что полоса контекстного меню по умолчанию (например, вырезать, копировать, вставить...) отображается поверх него.

Как отключить полосу контекстного меню по умолчанию?

Я определил источник проблемы. С помощью приведенного выше кода, устанавливающего координату Y, контекстное меню по умолчанию будет отображаться поверх контекстного меню конкретного элемента управления (mContextMenu). Если эта линия отмечена или если координата Y установлена в
e.Location.Y
контекстное меню по умолчанию не отображается. Кроме того, если mContextMenu установлен дисплей на
e.Location
mContextMenu.Show(Parent.PointToScreen(e.Location))
, контекстное меню по умолчанию будет отображаться в элементе управления, а mContextMenu будет отображаться в месте на содержащей полосе инструментов (в левом конце полосы инструментов). Я не знаю, почему это происходит. Мне бы хотелось, чтобы кто-нибудь объяснил мне это поведение.

Проблема с этим заключается в том, что пользователь не может видеть содержимое элемента управления при отображении контекстного меню. Он находится прямо над пультом управления.

Что я уже пробовал:

В форме, которая использует этот элемент управления, я установил toolstrip контейнера в новое (пустое) контекстное меню при запуске:
tsMain.ContextMenuStrip = New ContextMenuStrip


Кроме того, я создал новое пустое контекстное меню и назначил его tsMain в design.

Ни один из этих методов не предотвращает отображение полосы контекстного меню по умолчанию, когда я щелкаю правой кнопкой мыши на этом элементе.

Kevin Brady

Я опубликовал новый вопрос об использовании этого. https://www.codeproject.com/Questions/1226184/Get-the-embedded-source-control-object

1 Ответов

Рейтинг:
4

Alan N

Я думаю, что проблема заключается в том, что новый ContextMenuStrip не был назначен ToolStripComboBox. Как только это будет сделано, он просто будет работать, и обработчик MouseDown и код позиционирования будут ненужны.

ToolStripComboBox-это довольно простая оболочка вокруг системы.Окна.Формы.ComboBox и он не раскрывает всю базовую функциональность, но есть свойство, которое это делает. Найти управления toolstripcombobox.Поле со списком.ContextMenuStrip свойство и запихнуть туда новое меню. Как только это будет сделано, старомодное родное меню исчезнет.

Алан.


Kevin Brady

Полоса контекстного меню была назначена пользовательскому элементу управления toolstripcombobox в конструкторе. Но проблема не в этом. Пожалуйста, перечитайте мое описание, включая новую информацию, которую я представил вчера. В дополнение к первоначальному вопросу, возможно, более фундаментальный вопрос заключается в том, откуда в приложении берется полоса инструментов по умолчанию?

Alan N

ComboBox-это комбинация текстового поля и списка, и это меню по умолчанию происходит из части win32 EditControl (TextBox). Я всегда думал, что это позор, что Microsoft не удалила это меню из программы .NET textbox и combobox, поскольку они выглядят действительно неуместно и не могут быть настроены, кроме как путем замены.

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

Kevin Brady

Я исследовал это дальше, и Алан Н прав. Я изменил исходный пользовательский класс, чтобы удалить метод OnMouse down, и назначил контекстное меню непосредственно базовому ComboBox. Это работает, как и ожидалось.

Публичная Собственность ContextMenuStrip() Как ContextMenuStrip
Возьми
Вернуть Мне.Поле со списком.Управления contextmenustrip
Конец Получить
Установить(бывал iConMenu как ContextMenuStrip)
Меня.Поле со списком.ContextMenuStrip = iConMenu
Комплект
Конечное Свойство

Спасибо Алан Н.

Alan N

Не обращай внимания на мой последний комментарий. Мы, должно быть, редактировали примерно в одно и то же время.

Kevin Brady

Теперь перейдем к тому, как им пользоваться. Скоро я опубликую еще одну тему.

Kevin Brady

Я отправил новый вопрос. https://www.codeproject.com/Questions/1226184/Get-the-embedded-source-control-object