我正在尝试动态添加HubSections(C#代码) - 这有效 然后从相同的代码我想将ListBoxes添加到每个人 - 显然我不知道如何做到这一点。
我找到了几个例子,比如添加:
ContentTemplate = new DataTemplate() { VisualTree = ... }
...到HubSection构造函数,但DataTemplate中没有VisualTree。
如果我的问题描述太模糊,请询问任何细节 - 我是WP8.1新手,所以我可以跳过一些重要信息。
答案 0 :(得分:1)
我找到的最好的方法是创建像这样的DataTemplate:
public class ViewSection : HubSection {
public ViewSection(View view) {
string xaml = "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'><StackPanel /></DataTemplate>";
ContentTemplate = XamlReader.Load(xaml) as DataTemplate;
this.Loaded += ViewSection_Loaded;
}
private void ViewSection_Loaded(object sender, RoutedEventArgs e) {
base.OnApplyTemplate();
StackPanel stackPanel = findStackPanelInSubtree(this);
...
< adding stuff to stack panel >
...
this.Loaded -= ViewSection_Loaded;
}
private StackPanel findStackPanelInSubtree(FrameworkElement element) {
if (element != null) {
if (element.GetType() == typeof(StackPanel)) {
return element as StackPanel;
}
foreach (FrameworkElement child in getChildren(element)*) {
StackPanel result = findStackPanelInSubtree(child);
if (result != null) return result;
}
}
return null;
}
private List<FrameworkElement> getChildren(FrameworkElement element)* {
if (element != null) {
List<FrameworkElement> result = new List<FrameworkElement>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) {
result.Add(VisualTreeHelper.GetChild(element, i) as FrameworkElement);
}
return result;
}
return null;
}
}
这是微软开发者的某种残酷玩笑还是有更好的方法来做到这一点?
*当然这完全是多余的,但是foreach让它变得非常好看
答案 1 :(得分:1)
整个儿童系列的不可用看起来不太方便。但是,您可以重写方便的getChildren
方法来展示yield
关键字用法:
private List<FrameworkElement> getChildren(FrameworkElement element) {
if (element != null) {
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) {
yield return (VisualTreeHelper.GetChild(element, i) as FrameworkElement);
}
}
yield break;
}