WP7在pivotitem的头部内找到控件

时间:2010-11-21 16:20:20

标签: windows-phone-7 pivot

对于我的WP7应用程序,我需要找到一个日期控件,我已将其放置在pivotitem的标题模板中。 如何在当前所选PivotItem的代码中访问此datepicker控件?

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 个答案:

答案 0 :(得分:1)

我不知道有任何真正好的解决方案。我想我最初的想法是为什么你需要引用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。

HTH

答案 1 :(得分:1)

常规父/子关系对Pivot控件不起作用。您可以做的是直接在数据透视表中搜索DatePicked组件:

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

MainPivot是 Pivot 控件。我通过SelectedItem获取当前选定的项目 - 请注意我将其直接投射到 PivotItem ,否则我会得到对象。然后我正在寻找一个名为DateControl的控件,因为你为它设置了 x:Name

之后需要做的就是将对象强制转换为 DatePicker ,并以与对任何其他控件相同的方式访问其属性。