如何在WPF中制作“手风琴小工具”?

问题描述 投票:4回答:2

目标:

我试图在WPF中实现这样的事情:

Widget with several vertically stacked expanders (来源:wordpress.org


初步解决方案:

目前,我正在尝试使用ItemsControl和由ItemTemplate组成的Expander

我想要一致看看HeaderExpander部分,但我希望ContentExpander部分是完全灵活的。因此,它基本上是一组垂直堆叠的“portlet”,其中每个portlet具有一致的标题栏但内容不同。


到目前为止的代码:

这就是我现在所拥有的:

<ItemsControl
    Grid.Row="2"
    Grid.Column="2">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Expander>
                <Expander.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel
                            Orientation="Horizontal">
                            <TextBlock
                                FontSize="14"
                                FontWeight="Bold"
                                Text="Title_Of_Expander_Goes_Here" />
                            <TextBlock
                                Margin="10,0,0,0"
                                FontWeight="Bold"
                                FontSize="18"
                                Text="*" />
                        </StackPanel>
                    </DataTemplate>
                </Expander.HeaderTemplate>
                <Expander.Template>
                    <ControlTemplate
                        TargetType="Expander">
                        <Border
                            BorderThickness="1">
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Expander.Template>
            </Expander>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.Items>
        <StackPanel>
            <TextBlock
                FontSize="14"
                FontWeight="Bold"
                Text="Users:" />
            <wt:DataGrid
                Margin="0,1,0,0"
                AutoGenerateColumns="False"
                CanUserAddRows="True"
                CanUserDeleteRows="True"
                ItemsSource="{Binding Source={StaticResource Main_SystemUsers}, XPath=//Users/*}">
                <wt:DataGrid.Columns>
                    <wt:DataGridTextColumn
                        Header="User Name"
                        Binding="{Binding XPath=@UserName}" />
                    <wt:DataGridComboBoxColumn
                        Header="Role"
                        ItemsSource="{Binding Source={StaticResource Main_UserRoles}, XPath=//Roles/*}"
                        SelectedValueBinding="{Binding XPath=@Role}" />
                </wt:DataGrid.Columns>
            </wt:DataGrid>
            <StackPanel
                Margin="0,10,0,0"
                Orientation="Horizontal">
                <Button
                    Content="Add New User..." />
                <Button
                    Margin="10,0,0,0"
                    Content="Delete User..." />
            </StackPanel>
        </StackPanel>
    </ItemsControl.Items>
</ItemsControl>

讨论:

当我运行它时,唯一出现的是用户的DataGrid和它下面的按钮(“添加新用户”和“删除用户”)。没有Expander或标题栏。此外,即使我确实看到一个,我不知道如何为标题栏上显示的标题设置Binding。如果我使用ItemsSource,我知道如何进行绑定,但我想以声明方式设置我的项目。

问题:

我该怎么办呢?我正在寻找我现有的解决方案或干净的解决方案。

编辑:

我最终做的是用ItemsControl替换StackPanel,并为我的扩展器编写样式。事实证明这更简单,因为我需要为每个项目声明自定义内容,所以ItemsControl确实没有任何好处。剩下的一个问题是如何为每个扩展器实现自定义标题。这就是@Thomas Levesque建议使用TemplateBinding的地方。我所要做的就是用Text="Title_Of_Expander_Goes_Here"替换我标题模板中的Text="{TemplateBinding Content}"(见上面的代码)。

wpf xaml accordion
2个回答
3
投票

你没有看到Expander,因为你重新定义了它的模板。这个应该更好:

        ...
        <Expander.Template>
          <ControlTemplate
              TargetType="Expander">
              <Border
                  BorderThickness="1">
                  <Expander Content="{TemplateBinding Content}" Header="{TemplateBinding Header}"/>
              </Border>
          </ControlTemplate>
        </Expander.Template>
        ...

0
投票

我个人认为TreeView控件可以为你提供更好的工作基础,特别是如果你使用Expression Blend作为从项目创建新/空模板的基础。查看默认模板非常具有启发性,可以为您提供更细粒度的控制,更好地理解和洞察默认情况下的工作方式。然后你可以去他们的城镇。看起来你正在使用Hierchical Data和TreeViews本身就能很好地处理这些数据。

© www.soinside.com 2019 - 2024. All rights reserved.