Метод определения, применяются ли значения ключа мнемоники / ускорителя к элементу управления?
У меня есть приложение (.net framework 4, vb.net), которое изначально было приложением VB6. Чтобы имитировать части старого поведения управления вкладками, я реализую клавиши ускорения, которые позволяют переключаться на другую вкладку. Пример - TabControl с 5 вкладками. - Вкладка 2 имеет метку & Данные (ускоритель alt-d) с текстовым полем. - Пользователь выбрал вкладку 1 и нажимает alt-d, в результате чего элемент управления вкладкой выбирает вкладку 2 и устанавливает фокус на соответствующем текстовом поле.
Я написал некоторый код, который ищет вкладку, содержащую элемент управления (я делаю это путем переопределения ProcessMnemonic), и просто просматриваю вкладки (начиная с выбранной), и, если я нахожу совпадение, я выбираю вкладку и затем разрешаю системе обработать мнемонику, вызвав "MyBase.ProcessMnemonic(charCode)".
Но моя проблема - это вызов Control.IsMnemonic. Поскольку вы передаете "Text" только элементу управления, любой элемент управления, содержащий & в его текстовом свойстве, может привести к совпадению.
Например, myTextbox.Text = "here &friend" заставит Alt-F установить фокус на этом поле.
Я могу явно проверить, является ли тип элемента управления меткой... но тогда мне также нужны групповые ящики и... что? Кнопки мне тоже надо разрешить мнемонику...
Вот некоторый код (заметьте, я не включил итерацию табуляции, так как она не выглядела уместной);
Private Function IsMnemonicInThisContainer(charCode As Char, controlContainer As System.Windows.Forms.Control.ControlCollection) As Boolean
For Each ctrl As Control In controlContainer
If Control.IsMnemonic(charCode, ctrl.Text) Then
If ControlIsAlive(ctrl) Then
Return True
End If
ElseIf ctrl.HasChildren Then
If ControlIsAlive(ctrl) AndAlso IsMnemonicInThisContainer(charCode, ctrl.Controls) Then
Return True
End If
End If
Next
Return False
End Function
Private Function ControlIsAlive(ctrl As Control) As Boolean
' In a TABPAGE that is not selected, the controls all appear to be visible = FALSE,
' because they aren't actually "visible" - HOWEVER... the control itself may be expecting
' to be visible (once it's tab is shown)... so this call to GetStateMethodInfo which I grabbed from
' http://stackru.com/questions/3351371/using-control-visible-returns-false-if-its-on-a-tab-page-that-is-not-selected
' is the solution I needed.
' Instead of walking the tree though I am going to "check containers" as I drop into them... if they are not enabled/visible
' then I'm not going to go any deeper
' Is control enabled and going to be shown? (calling ctrl.visible allows us to bypass the other call if we can!)
Return (ctrl.Enabled AndAlso (ctrl.Visible OrElse CBool(GetStateMethodInfo.Invoke(ctrl, New Object() {2}))))
End Function
Я полагаю, я мог бы сделать что-то вроде...
Если Typeof Ctrl - Label или orelse Typeof Ctrl - это групповое поле (и т. Д.)...
Но свойство (или метод) для определения этого было бы здорово. Есть идеи?
Спасибо! Крис Вудрафф