Как добавить панель инструментов внизу, вверху, слева или справа внутри списка в WPF?

У меня есть список со скругленными углами. Я хотел бы добавить в список панель инструментов, относящуюся к этому конкретному списку. В настоящее время, если я добавлю панель инструментов в сетку, содержащую список, она будет перекрывать последний элемент в строке (в зависимости от высоты панели инструментов). Есть ли у кого-нибудь идеи, как лучше всего это реализовать? Я знаю, что могу создать элемент управления границей, который соответствует внешнему виду краев списка, а затем разместить список со стилем без границ внутри основной границы, сложенный с панелью инструментов внизу, но я надеюсь, что есть лучший способ сохраните мой текущий стиль списка и просто поместите панель инструментов в нижнюю часть списка, которая не скрывает никаких элементов списка.

Спасибо,

Джон


person John Rennemeyer    schedule 23.09.2009    source источник


Ответы (2)


Не уверен, что полностью понимаю, но думаю, у вас есть несколько вариантов:

  1. Интегрируйте ToolBar в шаблон ListBox, возможно, написав элемент управления, расширяющий ListBox и добавляющий свойство для установки ToolBar элементов.
  2. Выключите Border на ListBox и наклейте на него свой Border, который также включает ToolBar.

2 немного проще и, вероятно, то, что вам нужно.

Пример 1

(Я не стал создавать подклассы ListBox здесь - вместо этого я просто жестко закодировал некоторые элементы ToolBar)

    <Grid Margin="10">
        <ListBox>
            <ListBox.Template>
                <ControlTemplate TargetType="ListBox">
                    <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="1,1,1,1" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True" CornerRadius="5">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>

                            <ToolBarTray Background="White">
                                <ToolBar Band="1" BandIndex="1">
                                    <Button>
                                        Cut
                                    </Button>
                                    <Button>
                                        Copy
                                    </Button>
                                    <Button>
                                        Paste
                                    </Button>
                                </ToolBar>
                                <ToolBar Band="2" BandIndex="1">
                                    <Button>
                                        Undo
                                    </Button>
                                    <Button>
                                        Redo
                                    </Button>
                                </ToolBar>
                            </ToolBarTray>
                            <ScrollViewer Grid.Row="1" Padding="{TemplateBinding Control.Padding}" Focusable="False">
                                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                            </ScrollViewer>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="UIElement.IsEnabled" Value="False">
                            <Setter Property="Panel.Background" TargetName="Bd">
                                <Setter.Value>
                                    <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                        <Trigger Property="ItemsControl.IsGrouping" Value="True">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </ListBox.Template>
            <ListBoxItem>One</ListBoxItem>
            <ListBoxItem>Two</ListBoxItem>
            <ListBoxItem>Three</ListBoxItem>
        </ListBox>
    </Grid>

Пример 2

<Grid Margin="10">
    <Border CornerRadius="5" BorderThickness="1" BorderBrush="Black" Padding="1">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <ToolBarTray Background="White">
                <ToolBar Band="1" BandIndex="1">
                    <Button>
                        Cut
                    </Button>
                    <Button>
                        Copy
                    </Button>
                    <Button>
                        Paste
                    </Button>
                </ToolBar>
                <ToolBar Band="2" BandIndex="1">
                    <Button>
                        Undo
                    </Button>
                    <Button>
                        Redo
                    </Button>
                </ToolBar>
            </ToolBarTray>
            <ListBox Grid.Row="1" BorderThickness="0">
                <ListBoxItem>One</ListBoxItem>
                <ListBoxItem>Two</ListBoxItem>
                <ListBoxItem>Three</ListBoxItem>
            </ListBox>
        </Grid>
    </Border>
</Grid>

В обоих случаях результат выглядит примерно одинаково:

альтернативный текст http://img42.imageshack.us/img42/372/screenshotof.png < / а>

person Kent Boogaart    schedule 23.09.2009

Скорее всего, в вашем коде что-то заявлено не так, если что-то визуально перекрывается. Вы должны объявить свой ListBox с помощью Grid.Row = "0", а вашу панель инструментов как Grid.Row = "1" (или что-то подобное), если вы не хотите, чтобы они перекрывались. Эта статья MSDN хорошо объясняет макеты сетки.

Если ваши ListBoxItems не привязаны к данным, вы можете просто добавить ListBoxItem с настраиваемым стилем в качестве последнего элемента в вашем списке. В противном случае вы можете использовать DataTemplateSelector для форматирования стили ваших элементов основаны на содержимом, связанном внутри.

person Jeff Wain    schedule 23.09.2009