ListBox不使用Grid.Column - WPF中的所有可用空间

时间:2013-02-11 21:12:42

标签: c# wpf .net-4.0 listbox grid-layout

我有一个已分配给Grid.Column 0的ListBox控件,其值为'*',为其宽度定义,但在渲染时,有大量空间未被使用。

我还注意到ListBox控件本身周围有一些边框,但是我没有在标记中添加一个边框。

我的用户界面(以红色标记的关注区域):

enter image description here

我的标记:

<Window.Resources>
        <DataTemplate x:Key="GameImagesTemplate" >
            <StackPanel Orientation="Vertical">
                <Image Source="{Binding FileInfo.FullName}" Margin="8,8,8,8" Height="70" Width="70" />
                <Label Content="{Binding Name}" Width="70" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="GameTemplate">
            <StackPanel>
                <Label Content="{Binding Name}" Background="Gray" FontSize="16" />
                <ListBox x:Name="imageContent" ItemsSource="{Binding FileList}" ItemTemplate="{StaticResource GameImagesTemplate}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel Orientation="Horizontal" IsItemsHost="True" />
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <ListBox x:Name="ContentList" ItemTemplate="{StaticResource GameTemplate}" Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" />

        <StackPanel Grid.Column="1" Background="DarkGray">
            <Button Click="OnLoad">_Load</Button>
            <Button Click="OnSave">_Save</Button>
            <Button Click="OnAdd">_Add</Button>
            <Button Click="OnDelete">_Delete</Button>
        </StackPanel>
    </Grid>

我将如何解决所提出的两个问题。它是ListBox控件的默认行为吗?

非常感谢

1 个答案:

答案 0 :(得分:4)

是的,这是默认行为。

在对齐的情况下,看起来每个WrapPanel中都有一个ListBoxItem,它没有足够的空间将另一个项目放在第1行。剩余的空间未被使用,因为HorizontalContentAlignment上的ListBox设置默认为左侧。此设置又由默认ListBoxItem绑定。在HorizontalContentAlignment="Stretch"上设置ListBox应该可以解决问题。

外边框来自BorderBrushBorderThickness的默认设置。设置BorderThickness="0"将完全摆脱它。

还有一些其他默认Padding设置可在默认样式和模板中添加一些间距。如果您想了解更多内容,请在Blend中为项目添加ListBox并制作其默认TemplateItemContainerStyle的副本,然后查看XAML。如果您不需要选择行为,也请考虑使用基础ItemsControl,因为它没有任何这些类型的默认设置。