Как получить доступ к элементу в DataTemplate GridViewColumnHeader? - PullRequest
0 голосов
/ 29 октября 2010

Как я могу получить доступ к элементу (TextBlock) в DataTemplate GridViewColumnHeader из кода ????Я хочу установить фокус на заголовке столбца.

1 Ответ

1 голос
/ 29 октября 2010

Просто любой GridViewColumnHeader или один в частности? Вы можете использовать этот код

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

    }
}

И вспомогательные методы

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;
}

Обновление

Чтобы GridViewColumnHeader получил фокус, вы можете

columnHeader.Focus();

В зависимости от того, где вы это делаете, может не сработать, тогда вы можете попробовать

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

Также убедитесь, что ваш GridViewColumnHeader имеет следующие атрибуты

<GridViewColumnHeader IsTabStop="True" Focusable="True">
...