防止WPF ListView或ListBox显示“half”项

时间:2011-05-18 13:15:42

标签: wpf listview listbox

在我们的应用程序中,我们在网格中有一些ListViews和ListBoxes,您可以借助网格分割器更改控件的实际高度。 这样做时,您可以排列ListBox的高度,因此其中一个项目不完全可见,因为ListView变短以显示它。

这是我们不想要的行为。

从我的研究到目前为止,似乎没有办法阻止ListBox或ListView显示部分项目,但也许有人找到另一种方法来处理这个问题。也许当物品只有一半可见时,物品可以触发它自己不可见。但我们怎么能找到答案呢?

我们欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

我无法以这种方式修复ListView。但是,对于ListBox,您可以覆盖ArrangeOverride并自行排列项目。堆叠您想要查看的项目,并排列您不希望看到的项目(例如,部分可见的项目),以便它们不可见。例如,非虚拟化版本:

    /// <summary>
    /// Used to arrange all of the child items for the layout.
    /// Determines position for each child.
    /// </summary>
    /// <param name="finalSize">Parent passes this size in</param>
    /// <returns>Parent size (always uses all of the allowed area)</returns>
    protected override Size ArrangeOverride(Size finalSize)
    {
        // Arrange in a stack
        double curX = 0;
        double curY = 0;
        foreach (UIElement child in InternalChildren)
        {
            double nextY = curY + child.DesiredSize.Height;
            if (nextY > finalSize.Height)         // Don't display partial items
                child.Arrange(new Rect());
            else
                child.Arrange(new Rect(curX, curY, child.DesiredSize.Width, child.DesiredSize.Height);
            curY = nextY;
        }

        return finalSize;
    }

答案 1 :(得分:0)

您只需将MinHeight或MinWidth设置为您要调整大小的单元格。试试这个:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition MinHeight="50"/>
        </Grid.RowDefinitions>
        <ListBox HorizontalAlignment="Center" Margin="10">
            <ListBoxItem>First</ListBoxItem>
            <ListBoxItem>Second</ListBoxItem>
            <ListBoxItem>Third</ListBoxItem>
            <ListBoxItem>Fourth</ListBoxItem>
        </ListBox>
        <GridSplitter Grid.Row="1" Height="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
        <ListView Grid.Row="2" Margin="4">
            <ListViewItem>First</ListViewItem>
            <ListViewItem>Second</ListViewItem>
            <ListViewItem>Third</ListViewItem>
            <ListViewItem>Fourth</ListViewItem>
        </ListView>
    </Grid>