WPF: сложное поведение фокуса вкладки

Мой элемент управления состоит из вложенных списков и древовидных представлений. Каждый элемент списка / дерева также содержит поля форматированного текста и другие элементы управления.

Я хочу определить поведение фокуса «вкладки» таким образом, чтобы, когда пользователь нажимает «Tab», фокусируется следующий элемент, на который можно сфокусироваться (в соответствии с определенным мной порядком).

В настоящее время он не работает так, как я принимаю (работает только частично).

Мой вопрос не относится к моему случаю - скорее, о том, как вообще определить такое поведение. В качестве крайнего примера, скажем, я хочу полностью контролировать это и заставить фокус перемещаться между элементами, физически не рядом.

Кто-нибудь может знать, как это можно контролировать?


person Gilad    schedule 27.09.2010    source источник


Ответы (2)


Джо, этот механизм умнее, чем я думал, проверьте это вложение - он отлично работает:

<ListBox KeyboardNavigation.TabNavigation="Continue">
    <ListBoxItem Focusable="False">
        <ListBox KeyboardNavigation.TabNavigation="Continue">
            <ListBox.Items>
                <ListBoxItem Focusable="False">
                    <TextBox Width="300" KeyboardNavigation.TabIndex="1" Focusable="True"/>
                </ListBoxItem>
                <ListBoxItem Focusable="False">
                    <TextBox Width="300" KeyboardNavigation.TabIndex="2" Focusable="True"/>
                </ListBoxItem>
                <ListBoxItem Focusable="False">
                    <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                </ListBoxItem>
            </ListBox.Items>
        </ListBox>
    </ListBoxItem>
    <ListBoxItem Focusable="False">
        <ListBox KeyboardNavigation.TabNavigation="Continue">
            <ListBox.Items>
                <ListBoxItem Focusable="False">
                    <TextBox Width="300" KeyboardNavigation.TabIndex="1" Focusable="True"/>
                </ListBoxItem>
                <ListBoxItem Focusable="False">
                    <StackPanel>
                        <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                        <Border BorderBrush="Red">
                            <ListBox KeyboardNavigation.TabNavigation="Continue">
                                <ListBoxItem Focusable="False">
                                    <ListBox KeyboardNavigation.TabNavigation="Continue">
                                        <ListBox.Items>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="1" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="2" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                                            </ListBoxItem>
                                        </ListBox.Items>
                                    </ListBox>
                                </ListBoxItem>
                                <ListBoxItem Focusable="False">
                                    <ListBox KeyboardNavigation.TabNavigation="Continue">
                                        <ListBox.Items>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="1" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="2" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                                            </ListBoxItem>
                                        </ListBox.Items>
                                    </ListBox>
                                </ListBoxItem>
                            </ListBox>
                        </Border>
                    </StackPanel>
                </ListBoxItem>
                <ListBoxItem Focusable="False">
                    <StackPanel>
                        <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                        <Border BorderBrush="Red">
                            <ListBox KeyboardNavigation.TabNavigation="Continue">
                                <ListBoxItem Focusable="False">
                                    <ListBox KeyboardNavigation.TabNavigation="Continue">
                                        <ListBox.Items>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="1" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="2" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                                            </ListBoxItem>
                                        </ListBox.Items>
                                    </ListBox>
                                </ListBoxItem>
                                <ListBoxItem Focusable="False">
                                    <ListBox KeyboardNavigation.TabNavigation="Continue">
                                        <ListBox.Items>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="1" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="2" Focusable="True"/>
                                            </ListBoxItem>
                                            <ListBoxItem Focusable="False">
                                                <TextBox Width="300" KeyboardNavigation.TabIndex="3" Focusable="True"/>
                                            </ListBoxItem>
                                        </ListBox.Items>
                                    </ListBox>
                                </ListBoxItem>
                            </ListBox>
                        </Border>
                    </StackPanel>
                </ListBoxItem>
            </ListBox.Items>
        </ListBox>
    </ListBoxItem>
</ListBox>
person Gilad    schedule 27.09.2010

Вы ищете KeyboardNavigation.TabIndex собственность?

person Joe White    schedule 27.09.2010
comment
Привет, Джо, спасибо за быстрый повтор. Это могло быть возможным решением. Дело в том, что мой документ чрезвычайно сложен, пользователь может перемещать элементы вверх и вниз - мне придется управлять этими индексами. Вы знаете, как это будет вести себя во вложенных списках? Например, внешние элементы будут индексироваться от 0 до N, а внутренние элементы также будут индексироваться от 0 до M, в этом случае ваше предложение будет работать для меня. - person Gilad; 27.09.2010
comment
Я никогда не вкладывал один список в другой, поэтому я не уверен. Если вы пытаетесь использовать Tab для перемещения между элементами списка в одном и том же списке, вам может потребоваться поиграть с KeyboardNavigation.TabNavigation в ListBox. Похоже, что порядок табуляции по умолчанию идет между элементами управления в одном элементе списка, затем к следующему элементу списка. Если вам нужно что-то другое, взгляните на другие свойства KeyboardNavigation. Если вы все еще застряли, я думаю, вам придется задать более конкретный вопрос. - person Joe White; 27.09.2010