كيفية الوصول إلى العنصر داخل datatemplate من GridViewColumnheader؟

StackOverflow https://stackoverflow.com/questions/4050727

سؤال

كيف يمكنني الوصول إلى عنصر (TextBlock) داخل datatemplate من GridViewColumnheader من الكود ؟؟؟؟ أريد أن أركز على رأس العمود.

هل كانت مفيدة؟

المحلول

فقط أي 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">
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top