gpt4 book ai didi

c# - 获取分隔符以填充剩余空间

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:10 24 4
gpt4 key购买 nike

我敢肯定这非常简单,但我似乎无法弄明白。

我有一个 ListBox 来显示项目,这些项目是用 DataTemplate 显示的。我现在想对这些项目进行分组,因此添加了一个基于制造商属性的组。这是在代码隐藏中完成的。

ICollectionView view = CollectionViewSource.GetDefaultView(Items);
PropertyGroupDescription groups = new PropertyGroupDescription("Manufacturer");
view.GroupDescriptions.Add(groups);

我想让每个组都在一个扩展器中,这样它们就可以隐藏起来。我通过查看 MSDN 上的 GroupTemplates 得到了这个工作 这涉及到有一个扩展器、文本 block ,然后是一个分隔符来排除额外的空间,就像在 Windows Vista/7 组中一样。如下所示。

Windows 7 Groups

我遇到的问题是我无法让分隔符正确填充剩余空间。如果我使用 MinWidth 值,我的所有扩展器都具有相同的宽度。如果我使用 {binding ActualWidth, ElementName=MyListBox},则分隔符太宽,与包含它的控件一样宽。所以它将滚动条设置为可见,(见下面的截图)。如果我将宽度留空,则根本不会绘制分隔符。

我的直觉是堆栈面板应该扩展分隔符以使用剩余空间,但它没有。所以我在下面的 XamlCode 中尝试了 DockPanel,但这也失败了。我在使用合适的宽度让控件填充剩余空间时遇到了一些其他问题,所以如果你能帮我解决这个问题,那就太好了。

Current WPF ListBox-Group header Width Issue

我当前的 WPF Xaml 标记。您需要添加元素才能使其显示内容。

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="myStackPanel">
<ListBox x:Name="MyListBox">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<DockPanel HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Height="Auto"
Width="{Binding ActualWidth, ElementName=MyListBox}"
Margin="10">
<TextBlock DockPanel.Dock="Left" Margin="0" FontSize="14" FontWeight="Bold" Foreground="Black" Text="{Binding Path=Name}"/>
<Separator DockPanel.Dock="Right" Margin="4,0,4,0"></Separator>
</DockPanel>
</Expander.Header>
<ItemsPresenter Margin="5,0,0,0" />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<!-- Data Template Here -->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</ScrollViewer>

最佳答案

其实并不简单,Expander 的控件模板由一个作为 Header 的 ToggleButton 和一个作为内容的 ContentPresenter 组成。问题是 ToggleButton 本身有一个特殊的样式和模板,其中包含硬编码对齐的箭头,默认的看起来像这样:

<Style x:Key="ExpanderDownHeaderStyle"
TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Padding="{TemplateBinding Padding}">
<Grid Background="Transparent"
SnapsToDevicePixels="False">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="19"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- ... -->

<!-- The HorizontalAlignment needs to be set to stretch here -->
<ContentPresenter Grid.Column="1"
Margin="4,0,0,0"

HorizontalAlignment="Left"

VerticalAlignment="Center"
SnapsToDevicePixels="True"
RecognizesAccessKey="True"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<!-- ... -->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

要使您的样式生效,您需要修改默认的 Expander 模板(获取默认模板 on MSDN - Default WPF Themes 链接)。不好,但你真的没有太多选择。

关于c# - 获取分隔符以填充剩余空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6325359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com