我有一个带有圆角样式的列表框。我想在与该特定列表框相关的列表框内添加一个工具栏。目前,如果我在包含列表框的网格内添加一个工具栏,它将与行中的最后一项重叠(取决于工具栏的高度)。有没有人对实现这一点的最佳方法有任何想法?我知道我可以创建一个与列表框边缘的外观相匹配的边框控件,然后在与底部的工具栏堆叠的主边框内放置一个没有边框的样式的列表框,但我希望有更好的方法来保留我当前的列表框样式,只需在列表框底部放置一个工具栏,该工具栏不会隐藏任何列表框项目。
谢谢,
约翰
我有一个带有圆角样式的列表框。我想在与该特定列表框相关的列表框内添加一个工具栏。目前,如果我在包含列表框的网格内添加一个工具栏,它将与行中的最后一项重叠(取决于工具栏的高度)。有没有人对实现这一点的最佳方法有任何想法?我知道我可以创建一个与列表框边缘的外观相匹配的边框控件,然后在与底部的工具栏堆叠的主边框内放置一个没有边框的样式的列表框,但我希望有更好的方法来保留我当前的列表框样式,只需在列表框底部放置一个工具栏,该工具栏不会隐藏任何列表框项目。
谢谢,
约翰
不确定我是否完全遵循,但我认为你有几个选择:
ToolBar
到ListBox
模板中,可能是通过编写一个扩展ListBox
并添加属性来设置ToolBar
项目的控件。Border
on theListBox
并在它周围贴上你自己的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>
在这两种情况下,结果看起来都相似:
如果事物在视觉上重叠,则很可能您的代码中声明了错误。如果您希望它们不重叠,您应该将您的 ListBox 声明为 Grid.Row="0" 并将您的工具栏声明为 Grid.Row="1" (或类似的东西)。这篇 MSDN 文章很好地解释了网格布局。
如果您的 ListBoxItems 不是数据绑定的,您可以添加一个具有自定义样式的 ListBoxItem 作为列表中的最后一项。否则,您可以使用DataTemplateSelector根据绑定的内容来格式化您的项目样式。