WP7 найти управление внутри заголовка центра - PullRequest
3 голосов
/ 21 ноября 2010

Для моего приложения WP7 мне нужно найти элемент управления датой, который я поместил в шаблон заголовка сводного элемента. Как получить доступ к этому элементу управления DatePicker в коде позади для текущего выбранного PivotItem?

public static T FindName<T>(string name, DependencyObject reference) where T : FrameworkElement
{
    if (string.IsNullOrEmpty(name))
    {
        throw new ArgumentNullException("name");
    }

    if (reference == null)
    {
        throw new ArgumentNullException("reference");
    }

    return FindNameInternal<T>(name, reference);
}

private static T FindNameInternal<T>(string name, DependencyObject reference) where T : FrameworkElement
{
    foreach (DependencyObject obj in GetChildren(reference))
    {
        T elem = obj as T;

        if (elem != null && elem.Name == name)
        {
            return elem;
        }

        elem = FindNameInternal<T>(name, obj);

        if (elem != null)
        {
            return elem;
        }
        else
        {
            //if (obj.GetType().FullName == "System.Windows.Controls.DataField")
            //    elem = (obj as DataField).Content as T;

            if (elem != null && elem.Name == name)
                return elem;
        }
    }
    return null;
}

private static IEnumerable<DependencyObject> GetChildren(DependencyObject reference)
{
    int childCount = VisualTreeHelper.GetChildrenCount(reference);

    if (childCount > 0)
    {
        for (int i = 0; i < childCount; i++)
        {
            yield return VisualTreeHelper.GetChild(reference, i);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 21 ноября 2010

Обычные отношения Родитель / Дитя на самом деле не работают для элемента управления Pivot. Что вы можете сделать, это найти компонент DatePicked непосредственно в PivotItem:

((DatePicker)((PivotItem)MainPivot.SelectedItem).FindName("DateControl"))

MainPivot - это элемент управления Pivot . Я получаю текущий выбранный элемент через SelectedItem - обратите внимание, что я приводю его к PivotItem напрямую, поскольку в противном случае я получаю объект . Затем я ищу элемент управления с именем DateControl, учитывая, что для него установлено x: Name .

Все, что нужно сделать после этого, приводит объект к DatePicker и получает доступ к его свойствам так же, как и для любого другого элемента управления.

1 голос
/ 21 ноября 2010

Я не знаю ни одного действительно хорошего решения для этого. Я думаю, моя первоначальная мысль была, почему вам нужна ссылка на объект DatePicker? Но я думаю, у тебя есть свои причины.

Возможное решение, хотя:
Вы можете использовать VisualTreeHelper, чтобы пройти по визуальному дереву из вашего основного элемента и остановиться, когда вы найдете объект правильного типа (DatePicker). Создайте вспомогательную функцию следующим образом:

private static DependencyObject GetDependencyObjectFromVisualTree(DependencyObject startObject, Type type)
{
    DependencyObject parent = startObject;

    while (parent != null)
    {
        if (type.IsInstanceOfType(parent))
            break;

        parent = VisualTreeHelper.GetParent(parent);
    }

    return parent;
}

Затем вызовите его с PivotItem в качестве DependencyObject, typeof (DatePicker) в качестве типа и, наконец, приведите возвращенный DependencyObject к DatePicker.

НТН

...