从C#代码向DataTemplate添加ListBox

时间:2015-06-07 15:23:57

标签: c# .net windows-phone-8.1

我正在尝试动态添加HubSections(C#代码) - 这有效 然后从相同的代码我想将ListBoxes添加到每个人 - 显然我不知道如何做到这一点。

我找到了几个例子,比如添加:

ContentTemplate = new DataTemplate() { VisualTree = ... }

...到HubSection构造函数,但DataTemplate中没有VisualTree。

如果我的问题描述太模糊,请询问任何细节 - 我是WP8.1新手,所以我可以跳过一些重要信息。

2 个答案:

答案 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;
}
相关问题