Windows phone 7 WP7在数据透视项的标题内查找控件

Windows phone 7 WP7在数据透视项的标题内查找控件,windows-phone-7,pivot,Windows Phone 7,Pivot,对于我的WP7应用程序,我需要找到一个日期控件,该控件已放置在数据透视项的标题模板中。 如何在当前选定数据透视项的代码隐藏中访问此datepicker控件 public static T FindName<T>(string name, DependencyObject reference) where T : FrameworkElement { if (string.IsNullOrEmpty(name)) { throw new Argument

对于我的WP7应用程序,我需要找到一个日期控件,该控件已放置在数据透视项的标题模板中。 如何在当前选定数据透视项的代码隐藏中访问此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);
        }
    }
}
public static T FindName(字符串名称,DependencyObject引用),其中T:FrameworkElement
{
if(string.IsNullOrEmpty(name))
{
抛出新的ArgumentNullException(“名称”);
}
if(reference==null)
{
抛出新的ArgumentNullException(“引用”);
}
返回FindNameInternal(名称、引用);
}
私有静态T FindNameInternal(字符串名称,DependencyObject引用),其中T:FrameworkElement
{
foreach(GetChildren中的DependencyObject对象(参考))
{
T elem=obj作为T;
if(elem!=null&&elem.Name==Name)
{
返回元素;
}
elem=FindNameInternal(名称,obj);
if(elem!=null)
{
返回元素;
}
其他的
{
//if(obj.GetType().FullName==“System.Windows.Controls.DataField”)
//elem=(obj作为数据字段)。内容作为T;
if(elem!=null&&elem.Name==Name)
返回元素;
}
}
返回null;
}
私有静态IEnumerable GetChildren(DependencyObject引用)
{
int childCount=VisualTreeHelper.GetChildrenCount(参考);
如果(childCount>0)
{
for(int i=0;i
我不知道有什么真正好的解决办法。我想我最初的想法是为什么需要对DatePicker对象的引用?但我想你有你的理由

不过,一个可能的解决方案是:
您可以使用VisualTreeHelper从透视项遍历可视树,并在找到正确类型的对象(日期选择器)时停止。创建如下所示的帮助器函数:

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

常规的父/子关系实际上不适用于透视控件。您可以直接在数据透视项中搜索DatePicked组件:

((DatePicker)((PivotItem)MainPivot.SelectedItem).FindName("DateControl"))
MainPivot是轴控件。我通过SelectedItem获取当前选定的项目-请注意,我直接将其强制转换为数据透视项目,否则我将获得一个对象。然后我正在寻找一个名为DateControl的控件,因为您为它设置了x:Name


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

devcube,请参阅问题中我更新的示例。我正在使用此代码查找日期选择器,但当我使用以下内容调用时,它总是从第一个数据透视项而不是所选数据透视项获取日期选择器:RadDatePicker RadDatePicker=VisualElementHelper.FindName(“RadDatePicker”,this);如果我使用-RadDatePicker-RadDatePicker=VisualElementHelper.FindName(“RadDatePicker”,CurrentPivotItem);如果CurrentPivotItem设置为PivotControl的SelectedItem,则返回空引用:(