对于我的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);
}
}
}
答案 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 ,并以与对任何其他控件相同的方式访问其属性。