Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用自定义项模板修复列表框的布局_.net_Wpf_Xaml - Fatal编程技术网

.net 如何使用自定义项模板修复列表框的布局

.net 如何使用自定义项模板修复列表框的布局,.net,wpf,xaml,.net,Wpf,Xaml,我已将自定义ItemTemplate应用于ListBox控件,但布局有问题。当列表框滚动到底部并调整大小时,项目溢出: 如果我向上滚动,布局似乎最终得到了纠正: 如果我删除设置HorizontalContentAlignment的行,问题就会消失(但我希望列表项拉伸以填充可用空间) 任何帮助都将不胜感激 <ListBox x:Name="myList" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.

我已将自定义ItemTemplate应用于ListBox控件,但布局有问题。当列表框滚动到底部并调整大小时,项目溢出:

如果我向上滚动,布局似乎最终得到了纠正:

如果我删除设置HorizontalContentAlignment的行,问题就会消失(但我希望列表项拉伸以填充可用空间)

任何帮助都将不胜感激

<ListBox x:Name="myList" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Visible">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="HorizontalContentAlignment"  Value="Stretch"></Setter>
            </Style>
        </ListBox.ItemContainerStyle>            
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Background="Lime" TextWrapping="Wrap" Text="{Binding Comments}"/>
                    <Grid Grid.Column="1" Background="Aqua">
                        <Button Width="20" Height="20" Content="..."/>
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>


列表框的默认
ItemsPanel
是一个
virtualzingstackpanel
,它很难处理
拉伸对齐。相反,尝试只包含一列的
UniformGrid

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <UniformGrid Columns="1"/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

虽然您的建议似乎有效,但如果没有虚拟化,性能还不够好(我已经用多达10000个项目进行了测试)。一件有效的事情是向ListBox的SizeChanged事件添加一个事件处理程序,并调用myList.Items.Refresh()。虽然感觉没有必要这样做,但到目前为止,这是我遇到的最好的折衷方案,尽管它也存在性能问题(调整窗口大小时出现了一些明显的口吃)。