Wahaj Khan Ответов: 1

Как реализовать порядок вкладок в форме windows в приложении на основе WPF


Привет Я работаю над приложением на основе WPF в C#. Приложение содержит форму на базе Windows, содержащую множество элементов управления. Мне нужно реализовать порядок вкладок в форме на базе Windows.
Как это можно получить. Помните,что приложение основано на WPF, а форма-на Windows.
Спасибо

Что я уже пробовал:

Я следовал правилам, устанавливая свойство Tab Stop и определяя свойство Tab index для всех элементов управления. Но это не работает для приложений на основе WPF.
Однако он работает в приложении на основе Windows Form.

1 Ответов

Рейтинг:
0

CHill60

Настройка Tabindex должна работать как в WPF, так и в WinForms. Вы можете установить его в XAML. например

<Button x:Name="Button1" TabIndex="2" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="0"/>
<Button x:Name="Button2" TabIndex="1" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="1"/>
<Button x:Name="Button3" TabIndex="0" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="2"/>
Или в окне свойств каждого элемента управления. Или в коде, стоящем за ним, например
Button1.TabIndex = 2;
Button2.TabIndex = 0;
Button3.TabIndex = 1;
При нормальных обстоятельствах WPF назначит порядок вкладок на основе логического дерева (Tab Order | 2000 вещей, которые вы должны знать о WPF[^]). Если он ведет себя не так, как ожидалось, правильно ли вы обслуживали контейнерный контроль?

Вероятно, лучшим способом было бы вообще не использовать TabIndex, а вырезать и вставить ваш код так, чтобы элементы управления были упорядочены в XAML в том порядке, в котором вы хотите, чтобы они имели tabindex, например
<Button x:Name="Button2" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="1"/>
<Button x:Name="Button1" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="0"/>
<Button x:Name="Button3" Height="60" Width="75" Margin="221,26,221,20" Grid.Row="2"/>
Примечание. при удалении TabIndex может быть полезно проверить, что свойство (в окне свойств) вернулось к значению по умолчанию 2147483647.

Если он все еще работает не так, как вы хотите, то максимально упростите свою форму, чтобы все еще продемонстрировать проблему и опубликовать XAML с помощью Улучшить вопрос ссылка

[Править - как просили некоторые "полные" решения]
Этот (весь) код демонстрирует, что именно порядок появления элементов управления в XAML определяет порядок табуляции, когда сам индекс табуляции не изменяется (т. е. окно свойств имеет индекс табуляции по умолчанию = 2147483647)
<Window x:Class="MainWindow" 

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions><RowDefinition/><RowDefinition/><RowDefinition/></Grid.RowDefinitions>
        <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions>
        <TextBox x:Name="TextBox1" Grid.Column="0" Grid.Row="0" Text="TextBox1" />
        <TextBox x:Name="TextBox2" Grid.Column="2" Grid.Row="1" Text="TextBox2" />
        <TextBox x:Name="TextBox3" Grid.Column="1" Grid.Row="1" Text="TextBox3" />
        <TextBox x:Name="TextBox4" Grid.Column="1" Grid.Row="0" Text="TextBox4" />
        <TextBox x:Name="TextBox5" Grid.Column="2" Grid.Row="2" Text="TextBox5" />
        <TextBox x:Name="TextBox6" Grid.Column="0" Grid.Row="2" Text="TextBox6" />
    </Grid>
</Window>
Текст в текстовых полях показывает порядок, в котором я ожидаю, что элементы управления будут сфокусированы при использовании клавиши tab. Сама форма выглядит немного так при первой загрузке:
TextBox1            TextBox4         (BlankCell)

(BlankCell)         TextBox3         TextBox2

TextBox6            (BlankCell)      TextBox5
В этой версии кода текстовые поля вкладываются в обратном порядке, т. е. TextBox6 является первым в этом порядке, а затем 5, 4, 3, 2, 1
<Window x:Class="MainWindow" 

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions><RowDefinition/><RowDefinition/><RowDefinition/></Grid.RowDefinitions>
        <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions>
        <TextBox x:Name="TextBox1" Grid.Column="0" Grid.Row="0" Text="TextBox1" TabIndex ="5"/>
        <TextBox x:Name="TextBox2" Grid.Column="2" Grid.Row="1" Text="TextBox2" TabIndex ="4"/>
        <TextBox x:Name="TextBox3" Grid.Column="1" Grid.Row="1" Text="TextBox3" TabIndex ="3"/>
        <TextBox x:Name="TextBox4" Grid.Column="1" Grid.Row="0" Text="TextBox4" TabIndex ="2"/>
        <TextBox x:Name="TextBox5" Grid.Column="2" Grid.Row="2" Text="TextBox5" TabIndex ="1"/>
        <TextBox x:Name="TextBox6" Grid.Column="0" Grid.Row="2" Text="TextBox6" TabIndex ="0"/>
    </Grid>
</Window>
Поведение формы будет таким же, если я заменю параметр XAML TabIndex на код позади При загрузке формы. Обратите внимание, что в проекте нет другого кода (кроме автоматически сгенерированного Application.xaml и т. д.), И я нацелился на .NET Framework 3.5.

Если ваша проблема заключается в том, что первое текстовое поле не выбирается до тех пор, пока вы не нажмете клавишу Tab в первый раз, попробуйте сделать это:
<Grid FocusManager.FocusedElement="{Binding ElementName=TextBox1}">
Обратите внимание на изменение поведения-с помощью этого FocusManager TextBox1 имеет фокус после загрузки формы, а клавиша Tab перемещает нас в TextBox6. Без FocusManager ничто не имеет фокуса при загрузке формы и клавиша Tab перемещает нас прямо в TextBox6


Wahaj Khan

Извиняюсь. Это больше не работает...Чтобы быть более конкретным выполните следующие действия:
1. Создайте приложение WPF с помощью C#.
2. Добавьте новую форму на базе Windows .
3. Поместите несколько текстовых полей на экран. (скажем, 5 или 6)
4. Установите индекс табуляции для всех элементов управления.
5. Отображения формы при выполнении приложения.
6. пожалуйста, отправьте заявку после тестирования заказа вкладки.
Спасибо

CHill60

Вот что я вам скажу - почему бы вам не опубликовать очень простой набор примеров XAML, который не работает так, как я предлагал. Фрагменты кода в моем решении были взяты из такого простого примера, и да, я действительно проверил порядок вкладок перед публикацией.