Telerik, обработай нажатие на текстовую зону RadDropDownButton

У меня есть RadDropDownButton с предопределенным текстом и с одним RadMenuItem:

введите описание изображения здесь

Мое намерение состоит в том, чтобы выполнить действие, когда я нажимаю на текстовую зону (НЕ на стрелку):

введите описание изображения здесь

А затем выполните другое действие, когда я нажму на выбираемый элемент:

введите описание изображения здесь

Обработка RadMenuItem.Click сделано, никаких проблем с этим, но RadDropDownButton.Click событие срабатывает, когда я нажимаю везде на элементе управления, а не только в текстовой зоне.

Как я могу это исправить, чтобы элемент управления работал так, как я хочу?

Private sub MyRadDropDownButton_click() handles MyRadDropDownButton.click

    ' this instruction should be launched only when clicking on the "Analyze" word.
    ' this means everywhere on the control but not on the arrow.
    msgbox("you've clicked on the "Analyze" word")

end sub

2 ответа

Решение

Их SplitButton - немного мозговая смерть, IMO. Наиболее SplitButtons обрабатывать область стрелки как виртуальную кнопку и либо пропустить выдачу события Button CLick, либо вместо этого отобразить соответствующее раскрывающееся меню (или оба). Большинство использует новое событие SplitClicked при щелчке по этой области, чтобы вы могли по необходимости возиться с меню:

Protected Overrides Sub OnMouseDown(ByVal mevent As MouseEventArgs)
    ...

    ' they clicked in the arrow.split rect
    If (SplitRect.Contains(mevent.Location)) Then

        ' notify them 
        RaiseEvent SplitClick(Me, New EventArgs)

        ' open the menu if there is one
        If ShowContextMenuStrip() = False Then
            skipNextClick = True       ' fixup for the menu
        End If         

    Else
        ' let the normal event get raised
        State = PushButtonState.Pressed
        MyBase.OnMouseDown(mevent)
    End If

End Sub 

У них нет аналогичных событий, но в качестве обходного пути вы можете использовать DropDownOpening событие, чтобы "отменить" событие нажатия кнопки, вот так (это работает, потому что событие DropDownOpening всегда запускается первым):

' workaround flag
Private IgnoreClickBecauseMenuIsOpening As Boolean
Private Sub RadSplitButton1_DropDownOpening(sender As Object, 
          e As EventArgs) Handles RadSplitButton1.DropDownOpening

    IgnoreClickBecauseMenuIsOpening = True
    ' code to modify menu (or not)

End Sub

Private Sub RadSplitButton1_Click(sender As Object, 
        e As EventArgs) Handles RadSplitButton1.Click

    ' ignore click if menu is opening
    If IgnoreClickBecauseMenuIsOpening Then
        ' reset flag
        IgnoreClickBecauseMenuIsOpening = False
        Exit Sub                    ' all done here
    End If
    ' normal code to execute for a click
End Sub

Решение:

Я назвал это "Различить щелчок стрелки без набора элемента по умолчанию", это работает для обоих RadDropDownButton а также RadSplitButton,

Public Class RadSplitButton_TestForm

''' <summary>
''' Flag that determines whether the RadSplitButton menu-opening should be canceled.
''' </summary>
Private CancelOpening As Boolean = False

Private Sub RadSplitButton1_DropDownOpening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _
Handles RadSplitButton1.DropDownOpening

    e.Cancel = Me.CancelOpening

End Sub

Private Sub RadSplitButton1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) _
Handles RadSplitButton1.MouseMove

    Me.CancelOpening = Not sender.DropDownButtonElement.ArrowButton.IsMouseOverElement

End Sub

Private Sub RadSplitButton1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) _
Handles RadSplitButton1.Click

    If e.Button = Windows.Forms.MouseButtons.Left AndAlso Me.CancelOpening Then
        MsgBox("clicked out the arrow!")

    ElseIf Not Me.CancelOpening Then
        MsgBox("clicked over the arrow!")

    End If

End Sub

End Class

PS: во-первых, меня пытались определить, является ли mouseposition над ArrowButton.ClientRectangle но это не дает ожидаемых результатов.

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