2010-10-29 22 views

Répondre

1

Juste n'importe quel GridViewColumnHeader ou un en particulier? Vous pouvez utiliser ce code

List<GridViewColumnHeader> allGridViewColumnHeaders = GetVisualChildCollection<GridViewColumnHeader>(listView); 
foreach (GridViewColumnHeader columnHeader in allGridViewColumnHeaders) 
{ 
    TextBlock textBlock = GetVisualChild<TextBlock>(columnHeader); 
    if (textBlock != null) 
    { 

    } 
} 

Et les méthodes d'aide

public List<T> GetVisualChildCollection<T>(object parent) where T : Visual 
{ 
    List<T> visualCollection = new List<T>(); 
    GetVisualChildCollection(parent as DependencyObject, visualCollection); 
    return visualCollection; 
} 

private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual 
{ 
    int count = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < count; i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
     if (child is T) 
     { 
      visualCollection.Add(child as T); 
     } 
     else if (child != null) 
     { 
      GetVisualChildCollection(child, visualCollection); 
     } 
    } 
} 

private T GetVisualChild<T>(DependencyObject parent) where T : Visual 
{ 
    T child = default(T); 
    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
} 

Mise à jour

Pour faire un GridViewColumnHeader du focus, vous pouvez

columnHeader.Focus(); 

Selon l'endroit où vous cela peut ne pas fonctionner, alors vous pouvez essayer

EventHandler eventHandler = null; 
eventHandler = new EventHandler(delegate 
{ 
    listView.LayoutUpdated -= eventHandler; 
    GridViewColumnHeader columnHeader = GetVisualChild<GridViewColumnHeader>(listView); 
    columnHeader.Focus(); 
}); 
listView.LayoutUpdated += eventHandler; 

Assurez-vous également que votre GridViewColumnHeader possède les attributs suivants

<GridViewColumnHeader IsTabStop="True" Focusable="True"> 
+0

Merci pour la réponse. – Void

+0

Mais malheureusement, je n'arrive toujours pas à me concentrer. Après le tel code: foreach (GridViewColumnHeader columnHeader dans allGridViewColumnHeaders) { TextBlock textBlock = GetVisualChild (columnHeader); if (textBlock! = Null) { textBlock.Focusable = true; Keyboard.Focus (textBlock); pause; } } J'ai textBlock.IsKeyboardFocused == true, mais je ne vois pas le focus fisual. – Void

+0

En général, je dois avoir accès à certains GridViewColumnHeader. Le comportement doit être le suivant: Pour mettre en évidence GridViewColumnHeader. Ensuite, je choisis des colonnes au moyen de flèches. Appuyez sur Entrée. Selon la colonne sélectionnée, exécute l'action. – Void