Comment définir le focus sur le WPF DataGrid ou sa première ligne?
J'ai WPF DataGrid
placé sur le Window
. J'ai un bouton qui exécute une logique métier et remplit la grille.
Je veux mettre l'accent sur la DataGrid
(de préférence en première ligne dans la grille de données) lorsque je TAB
à partir du bouton. J'ai mis le TabIndex
mais de toute façon, l'accent n'est pas venu sur le contrôle DataGrid.
La partie pertinente de la forme du XAML est ici:
<StackPanel Orientation="Vertical" Grid.Column="2" Margin="20,10,10,10">
<Button Content="Search"
Height="25" HorizontalAlignment="Right" Margin="0,-25,0,0"
Name="btnSearch" VerticalAlignment="Top" Width="75" **TabIndex="1300"** Click="btnSearch_Click" Keyboard.KeyDown="btnSearch_PreviewKeyDown" LostFocus="btnSearch_LostFocus"/>
</StackPanel>
<DataGrid AutoGenerateColumns="False" Grid.Column="1" Margin="20,160,10,10" Name="dataGridOrganisations" **TabIndex="1400"**
BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Focusable="True"
ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" GridLinesVisibility="None"
ItemsSource="{Binding}" CanUserReorderColumns="False" CanUserResizeRows="False" IsReadOnly="True" SelectionChanged="dataGridOrganisations_SelectionChanged" Keyboard.PreviewKeyDown="dataGridOrganisations_PreviewKeyDown" >
<DataGrid.Columns>
<DataGridTextColumn Header="Shortname" Width="100" Binding="{Binding ShortName}" />
<DataGridTextColumn Header="Internal Code" Width="100" Binding="{Binding LocalID}"/>
<DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
Quand j'ai ajouté le code suivant sur le Bouton de LostFocus
cas, il met en évidence la première ligne. Mais quand j'utilise vers le bas touche de direction pour sélectionner la ligne suivante dans la grille; au lieu d'aller à la ligne suivante, il définit d'abord l'accent sur le bouton "Rechercher" et la prochaine fois, va à la deuxième ligne!
if (this.dataGridOrganisations != null && this.dataGridOrganisations.HasItems)
{
this.dataGridOrganisations.Focus();
if (dataGridOrganisations.Items != null && dataGridOrganisations.Items.Count > 0)
{
DataGridRow firstRow = this.dataGridOrganisations.ItemContainerGenerator.ContainerFromItem(dataGridOrganisations.Items[0]) as DataGridRow;
if (firstRow != null)
{
firstRow.IsSelected = true;
}
}
}
Comment définir le focus sur le contrôle DataGrid (ou sa première ligne)? Pourquoi TabIndex
ne fonctionne pas ici?
- S'il vous plaît aller à travers des commentaires sur le H. B. réponse. Le problème est résolu, d'après H. B. a souligné que TabIndex n'était pas nécessaire. Le déplacement de grille de données à l'intérieur de la StackPanel du contrôle de Bouton résolu le problème.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez même pas besoin d'un onglet d'index si il n'y a pas focusable des contrôles entre les
Button
etDataGrid
dans le contrôle de la hiérarchie. Vous avez tout à fait un peu de maîtres-chiens et tout semble un peu compliqué pour moi. Je ne peux pas repérer quelque chose dans ce code (peut-être que quelqu'un d'autre peut, bien sûr), ma suggestion serait que vous essayez de simplifier votre code jusqu'à ce qu'il fonctionne à nouveau comme il se doit par défaut. par exemple, ce code tabulation devrait fonctionner:Aussi, pourquoi les grands onglet index delta? Si vous utilisez 1301 & 1302 il ne pouvait pas être n'importe quelle valeur entre il devrait automatiquement être plus sûr de code.
DataGrid
à l'intérieur de laStackPanel
et il a résolu mon problème! La tabulation à l'intérieur de laDataGrid
se déplace contrôle à partir d'une cellule à l'autre que je veux arrêter maintenant, mais il ne fait pas partie de cette question.Ajouter le code suivant dans la grille de données de xaml
ajouter le code ci-dessous dans .cs fichier