树形列表

时间:2017-05-15 11:04:04

标签: wpf templates recursion datatemplate

我们希望菜单看起来像带有动画折叠/展开嵌套部分的折叠式样式,而不是树视图菜单。最初,我确实将我的列表分配给了树视图和树正确绘制,接下来我设法对手风琴风格进行原型设计(使用https://www.codeproject.com/Articles/248112/Templating-WPF-Expander-Control),但现在我想使用用于树的列表动态创建菜单。我是WPF的新手,所以通过将我的树状列表绑定到视图上以正确的方式做到这一点对我来说更令人生畏,所以我开始在c#中创建Expander和Stackpanels。我无法将模板分配给扩展器。我的部分xaml.cs代码:

    private void CreateMenu(PageViewModel n)
    {
        doRecurseTree(n, MenuStack);
    }

    private void doRecurseTree(PageViewModel n, StackPanel sp)
    {
        foreach (PageViewModel c in n.Children)
        {
            if (c.Children.Count() > 0)
            {
                Console.WriteLine("<expander header='"+c.Name+"'><stackpanel>");

                Expander ex = new Expander();
                ex.OverridesDefaultStyle = true;
                ex.Header = c.Name;
                ex.HorizontalAlignment = HorizontalAlignment.Left;
                ex.VerticalAlignment = VerticalAlignment.Top;
                ex.Template = /*"{StaticResource RevealExpanderTemp}"*/;

                StackPanel spc = new StackPanel();


                doRecurseTree(c, spc);
                Console.WriteLine("</stackpanel></expander>");
            }
            else
            {
                Console.WriteLine("<button content='" + c.Name+"' />");
                Button b = new Button();
                b.Content = c.Name;
                sp.Children.Add(b);
            }
        }

    }

我的原型中的xaml看起来像这样:

          <Expander Template="{StaticResource RevealExpanderTemp}"
          OverridesDefaultStyle="True"
          Header="Option 1"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          >
            <StackPanel>
              <Expander Template="{StaticResource RevealExpanderTemp}"
              OverridesDefaultStyle="True"
              Header="Sub Option 1"
              HorizontalAlignment="Left"
              VerticalAlignment="Top"
              >
                    <StackPanel>
                            <Button  Content="Item 1.1" Style="{StaticResource TestContentStyle}"/>
                            <Button  Content="Item 1.2" Style="{StaticResource TestContentStyle}"/>
                            <Button Content="Item 1.3" Style="{StaticResource TestContentStyle}"/>
                            <Button Content="Item 1.4" Style="{StaticResource TestContentStyle}"/>
                    </StackPanel>
              </Expander>

              <Expander Template="{StaticResource RevealExpanderTemp}"
              OverridesDefaultStyle="True"
              Header="Sub Option 2"
              ...

非常欢迎有关如何在C#中分配模板或在视图中执行解决方案的想法。

提前致谢, 史蒂夫

1 个答案:

答案 0 :(得分:0)

嗯,经过多次搜索,我轻松解决了模板样式问题。您必须查找样式并应用它:

ex.Template = (ControlTemplate)FindResource("RevealExpanderTemp");