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. Наиболее SplitButton
s обрабатывать область стрелки как виртуальную кнопку и либо пропустить выдачу события 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
но это не дает ожидаемых результатов.