带有ItemTemplate的ListBox(和ScrollBar!)

34

我有一个数据绑定和项模板化的ListBox:

<ListBox x:Name="lbLista" 
         ScrollViewer.VerticalScrollBarVisibility="Visible">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal">
          <CheckBox IsChecked="{Binding Deleteable, Mode=TwoWay}" />
          <Label Content="{Binding Name}" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这些项可以正常显示,它们来自于一个ObservableCollection。

问题在于出现了滚动条,但是无法使用——它没有可以拖动的手柄。我已经尝试在ListBox上设置一些ScrollView附加属性,但它们并没有改变这种情况。

4个回答

31

我将您的代码复制到测试项目中,并添加了大约20个项目,我获得可用的滚动条,没有问题,并且它们按预期工作。当我只添加几个项目(以至于不需要滚动)时,我无法使用滚动条。这可能是情况吗?您没有添加足够的项目吗?

如果您删除ScrollViewer.VerticalScrollBarVisibility="Visible",则滚动条仅在需要时显示。


10

ListBox将尝试扩展可用的高度。当您设置ListBox的Height属性时,您将获得一个实际起作用的滚动视图...

如果您希望您的ListBox适应可用的高度,您可以尝试从父控件调节高度。例如,在Grid中,设置RowDefinition的Height为Auto可能会起到作用...

希望这有帮助。


5
我从未成功地在StackPanel中放置任何可滚动的内容(派生自ScrollableContainer)。StackPanel具有奇怪的布局机制,在测量操作完成后会使子控件混淆,我发现垂直大小最终变为无限,因此不受约束-因此超出容器边界并被剪切。由于控件认为拥有所有空间而实际上没有,因此滚动条不显示。
您应该始终将可滚动的内容放置在容器内,以便在运行时进行布局操作时可以解析为已知高度,以便滚动条适当调整大小。视觉树中的父容器必须能够解析为实际高度,在网格中如果将RowDefinition的高度设置为auto或fixed,则会发生这种情况。
这也发生在Silverlight中。
-em-

0

谢谢您的回答。我也尝试了一下,在一个空项目中。看哪,天地创造者眷顾着我 - 它奏效了。我最初将ListBox放在根元素内部的StackPanel中,但某种原因导致ListBox无法在StackPanel中正常工作! =)

-pom-


7
你应该真正接受帮助你的原始答案,而不是你自己的确认。 :-) - Franci Penov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接