树列表中的 WPF C# 扩展器菜单
WPF C# Expander menu from tree list
我们希望菜单看起来像带有动画 collapse/expand 嵌套部分的手风琴样式,而不是树视图菜单。最初我确实将我的列表分配给树视图并且正确绘制了树,所以接下来我设法制作手风琴样式的原型(使用 https://www.codeproject.com/Articles/248112/Templating-WPF-Expander-Control)但现在我想使用用于树的列表动态创建菜单。我是 WPF 的新手,所以通过将我的树状列表绑定到视图来以正确的方式进行操作对我来说更令人生畏,所以我开始在 C# 中创建 Expander 和 Stackpanel。我在将模板分配给扩展器时遇到了困难。我的部分 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# 中分配模板或在视图中执行解决方案的想法。
提前致谢,
史蒂夫
好吧,经过多方搜索,我轻松解决了模板样式问题。您必须查找样式并应用它:
ex.Template = (ControlTemplate)FindResource("RevealExpanderTemp");
我们希望菜单看起来像带有动画 collapse/expand 嵌套部分的手风琴样式,而不是树视图菜单。最初我确实将我的列表分配给树视图并且正确绘制了树,所以接下来我设法制作手风琴样式的原型(使用 https://www.codeproject.com/Articles/248112/Templating-WPF-Expander-Control)但现在我想使用用于树的列表动态创建菜单。我是 WPF 的新手,所以通过将我的树状列表绑定到视图来以正确的方式进行操作对我来说更令人生畏,所以我开始在 C# 中创建 Expander 和 Stackpanel。我在将模板分配给扩展器时遇到了困难。我的部分 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# 中分配模板或在视图中执行解决方案的想法。
提前致谢, 史蒂夫
好吧,经过多方搜索,我轻松解决了模板样式问题。您必须查找样式并应用它:
ex.Template = (ControlTemplate)FindResource("RevealExpanderTemp");