Windows phone 7 WP7在数据透视项的标题内查找控件
对于我的WP7应用程序,我需要找到一个日期控件,该控件已放置在数据透视项的标题模板中。 如何在当前选定数据透视项的代码隐藏中访问此datepicker控件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
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,则返回空引用:(