|
■No91010 (魔界の仮面弁士) に追記 > 私の方法では、カテゴリー選択時(.GridItemType = GridItemType.Category)には > タブキーで「次のアイテム」ではなく「次のコントロール」に移動してしまうという > 問題もあるようです。(ProcessKeyPreview に WM_KEYDOWN が送られてこない)
ProcessKeyPreview で WM_KEYDOWN を拾う方法を使うのではなく、 ProcessTabKey を使うことで、カテゴリー選択時にも反応できるようです。
ということで、追加改修バージョン。
Public Class YourPropertyGrid Inherits System.Windows.Forms.PropertyGrid
Protected Overrides Function ProcessTabKey(forward As Boolean) As Boolean 'ProcessKeyPreview で WM_KEYDOWN を拾う方法を廃止し、 'ProcessTabKey を用いるようにしました。 Return SelectNextGridItem(forward) End Function
Private Function SelectNextGridItem(forward As Boolean) As Boolean Dim selected = SelectedGridItem If selected Is Nothing Then '選択しているアイテムが無い場合にエラーになる問題を修正しました。 Return False End If Dim root = GetRootGridItem(selected) Dim gridItems = Descendents(root).ToList() Dim currentIndex = gridItems.IndexOf(selected) Dim nextIndex As Integer 'Shift + Tab での逆順送りに対応させました。 If forward Then nextIndex = If(currentIndex < gridItems.Count - 1, currentIndex + 1, 0) Else nextIndex = If(currentIndex < 1, 0, currentIndex - 1) End If Return gridItems(nextIndex).Select() End Function
Private Function GetRootGridItem(item As GridItem) As GridItem Return If(item.GridItemType = GridItemType.Root, item, GetRootGridItem(item.Parent)) End Function
Private Iterator Function Descendents(item As GridItem) As IEnumerable(Of GridItem) If item.GridItemType = GridItemType.ArrayValue Then Return ElseIf item.GridItemType = GridItemType.Property Or item.GridItemType = GridItemType.Category Then 'カテゴリーからのタブ移動が可能になったので、 'GridItemType.Category も列挙対象に加えるようにしました。 Yield item End If For Each x As GridItem In item.GridItems '折りたたまれているアイテムは列挙しないようにしました。 If x.Parent.Expanded Then For Each y As GridItem In Descendents(x) Yield y Next End If Next End Function End Class
|