2

我有一个ListBox在其模板中有一个网格以允许 4 列。一列是ListBox. 我希望该列填充可用的水平空间。

列定义为:

<ControlTemplate TargetType="ListBoxItem">
    <Grid ScrollViewer.CanContentScroll="True" Margin="2">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20" />
            <ColumnDefinition Width="50" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="30" />
        </Grid.ColumnDefinitions>
        <CheckBox VerticalAlignment="Center" Grid.Column="0" IsChecked="{Binding IsSelected,
                  RelativeSource={RelativeSource TemplatedParent},
                  Mode=TwoWay}" />
        <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="{Binding Id}" />
        <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="{Binding Title}" />
        <Button HorizontalAlignment="Right" Grid.Column="3" Tag="{Binding Id}" Margin="5,0,5,0">-&gt;</Button>
    </Grid>
</ControlTemplate>

我已经尝试了几种排列方式,除了显式的大小设置外,没有任何东西可以在窗口中修复。然后,当我调整窗口大小时,它不会随之调整大小。

ListBox包裹在 aScrollViewer中以允许垂直滚动(我猜这就是让我感到困惑的原因。)

关于如何让第三列仅填充可用空间而不是更多的任何想法?

4

4 回答 4

1

您需要 的控制行为ListBox,还是仅将其用于布局。

如果您仅将其用于布局,则可以将 a 交换ListBox为 a 的ItemsControl内部ScrollViewer

这段代码(在设计器中工作)显示了这一点:

<ScrollViewer>
    <ItemsControl>
        <!--<ListBox>-->
        <Grid Margin="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20" />
                <ColumnDefinition Width="50" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="30" />
            </Grid.ColumnDefinitions>

            <CheckBox VerticalAlignment="Center" Grid.Column="0" IsChecked="True" />
            <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,5,0" Text="Id" />
            <TextBlock VerticalAlignment="Center" Grid.Column="2" Margin="5,0,5,0" Text="Title" />
            <Button HorizontalAlignment="Right" Grid.Column="3" Margin="5,0,5,0">-&gt;</Button>
        </Grid>
        <!--</ListBox>-->
    </ItemsControl>
</ScrollViewer>

ListBox就像 a 一样,它有一些在它的孩子身上杀死宽度的属性TreeView。因此,如果您可以避免使用它,仅出于布局原因,这可能是您最快的选择。

否则,您需要将您Grid的宽度数据绑定到 之外的虚拟对象的宽度ListView,但是当滚动条出现/消失时,混乱的一方正在处理宽度变化。

于 2009-12-04T04:52:42.093 回答
1

为什么需要将 ListBox 包装在 ScrollViewer 中?当 ListBox 的内容不适合可用空间时,它会自动显示 ScrollViewer。您可以从 XAML 中删除它,它应该仍然可以正常工作。至少,它对我有用。:)

我尝试了您的 ControlTemplate,它似乎工作得很好。问题是当第 3 列调整为 ListBox 的宽度时,如果第 3 列中的文本很长,则在所有文本都可见之前,第 4 列不会出现。

我还尝试了另一种布局方法,我不确定性能方面,但我的想法是使用 DockPanel 而不是 Grid。我在 XAML 中最后添加了第三列以使其填充剩余空间,并将其停靠在左侧(我将第四列停靠在右侧)。它仍然希望在第三列中显示整个字符串。我不知道为什么会发生这种情况,以及为什么当可用空间不足以显示文本时文本不会换行或使用省略号。

<Window.Resources>
    <Style TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <DockPanel Width="Auto">
                        <CheckBox Width="20" VerticalAlignment="Center" DockPanel.Dock="Left" IsChecked="{Binding IsSelected,
                                        RelativeSource={RelativeSource TemplatedParent},
                                        Mode=TwoWay}" />
                        <TextBlock Width="50" VerticalAlignment="Center" DockPanel.Dock="Left" Margin="5,0,5,0" Text="hi" />
                        <Button Width="30" HorizontalAlignment="Right" DockPanel.Dock="Right" Margin="5,0,5,0">-&gt;</Button>
                        <TextBlock VerticalAlignment="Center" DockPanel.Dock="Left" Margin="5,0,5,0" Text="afdjfksdhahjklfadshjlasffasdlhjsafdlhjasdfasfhdjlaslfhdjsfdhjlsfdlhjsfdhjsfdddsd" TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow" />
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>   
于 2009-12-04T07:36:36.793 回答
0

是的,我建议滚动查看器把你弄乱了,你可以将网格的宽度绑定到父对象的实际宽度,所以有一个定义的大小,* 必须实际填充。

于 2009-12-04T00:33:00.993 回答
0

我终于弄清楚了。

包含列表框需要将水平滚动条设置为禁用,如下所示:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 

一旦我这样做了,网格的大小就完美了。

在这些日子里,我会弄清楚所有这些“声明性的东西”是如何工作的。

于 2009-12-08T19:03:19.520 回答