Listbox中的滚动条无法工作

15

我有一个显示WPF控件列表的ListBox,但问题是即使有足够的项目应该需要滚动ListBox时,垂直滚动条也显示为禁用状态。另一个可能相关的事实是这个ListBox包含在一个Integration.ElementHost中。

以下是ListBox的XAML代码:

  // for brevity I removed the Margin and Tooltip attributes

  <Grid x:Class="Xyzzy.NoteListDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Name="stackPanel" Orientation="Vertical"
                ScrollViewer.VerticalScrollBarVisibility="Visible">
        <StackPanel Orientation="Horizontal">
            <CheckBox Name="AllRecent" IsChecked="False" >View All Recent</CheckBox>
            <CheckBox Name="AscendingOrder" IsChecked="False">Descending Order</CheckBox>
            <Button Name="btnTextCopy" Click="btnCopyText_Click">Copy All</Button>
        </StackPanel>
        <ListBox Name="NoteList"
                 ScrollViewer.CanContentScroll="True"
                 ScrollViewer.VerticalScrollBarVisibility="Visible">
        </ListBox>
      </StackPanel>
  </Grid>

每个 ListBox 项显示的控件的 XAML:

  <UserControl x:Class="Xyzzy.NoteDisplay"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
      <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
          <TextBlock Name="Heading" FontSize="10">Note Heading</TextBlock>
          <Button Name="btnCopyText" Height="20" FontSize="12"
                          Click="btnCopyText_Click">Copy
          </Button>
        </StackPanel>
        <TextBlock Name="Body" FontSize="14">Note Body</TextBlock>
      </StackPanel>
    </Grid>
  </UserControl>
8个回答

35

当我使用StackPanel时,出现了滚动条不可见的问题。我认为这是因为StackPanel的大小总是根据其所有子元素所需的大小来确定。尝试重新组织布局以删除StackPanel(使用Grid代替),看看它是否有帮助。


当我将Listbox放入Grid而不是StackPanel中时,问题消失了。这是WPF代码bug、WPF设计bug还是故意的WPF行为? - Jim Reineri
我认为这只是StackPanel的工作方式。在您的情况下,StackPanel的高度与ListBox所需的高度相同,而无需滚动,然后StackPanel在底部被“截断”。 - John Myczek
3
是的,问题出在 StackPanel 上,使用 Grid 解决了这个问题。感谢 @JohnMyczek。 - Mohsen Afshin
确实 - 我也遇到了同样的问题,通过成功移除StackPanel来解决了它。 - Zitun
2
如果网格解决方案一次不起作用,请为包含ListBox的行设置<RowDefinition Height="*" /> - Pollitzer
1
你是在开玩笑吗??我刚刚花了5个小时试图弄清楚为什么我的列表框表现不正常,原来是这个问题。谢谢! - Zonus

11

你只需要介绍Height属性,就像这样:

<ListBox Height="200" 
         Name="NoteList"
         ScrollViewer.CanContentScroll="True"
         ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>

1
确认该解决方案适用于StackPanel,尽管已接受的答案提到了其他情况。此外,“Visible”可以更改为“Auto”,这样只有在需要时才会出现滚动条。并且高度可以更改为MinHeight。 - Michel Keijzers
1
@MichelKeijzers - 仅硬编码高度只能在您不能调整大小时起作用。一旦有人调整窗口大小,这种方法就会失败。您需要以自动调整大小的方式来解决它。 - MBentley

4

嘿,我怀疑可能发生的情况是你的ListBox展开了足够多的项目,但是ListBox实际上消失在包含控件的底部。

ListBox是否真正停止或似乎仅消失?尝试在ListBox上设置MaxHeight,看看是否会出现滚动条。您应该能够将VerticalScrollBarVisibility设置为自动,仅在需要时才出现滚动条。


我应该提到我尝试按照你的建议限制Listbox的大小,但结果并没有改善。 - Jim Reineri
在我的情况下,Rach是正确的。控件只是无限地扩展并超出了我的控件边界。我曾经将ListBox放在一个网格行/列中,并将宽度/高度设置为自动。一旦将它们设置为“*”,ListBox就开始表现正常了。 - AlexeiOst

2

如果列表框位于StackPanel中,请尝试以下步骤:

  1. 设置 ScrollViewer.VerticalScrollBarVisibility="Auto"
  2. 将 ListBox 的 Height 属性设置为您期望看到的某个高度。

这样应该会强制显示滚动条。


2
这可能已经有点晚了,但是任何使用ListBox的人都不应该将其放在StackPanel中。当我将Listbox的父控件从StackPanel切换为DockPanel且LastChildFill=True(即ListBox是最后一个控件)时,我的滚动条完美地工作了。
希望这能帮助那些以上答案无法解决问题的人。

0

另一种修改 Dave 方案的解决方案是仅使用 ScrollViewer。您只能通过将鼠标放在 ScrollView 的滚动条上来滚动。我之所以这样使用它,是因为我不喜欢 ListBox 跳过项目并有时从顶部遗漏项目。这对眼睛也有点困难。我喜欢 ScrollViewer 的平滑滚动。


只需阅读此帖子即可在鼠标悬停在ListBox上时添加滚动。https://dev59.com/o07Sa4cB1Zd3GeqP1zsp?rq=1 - VcDeveloper

0

0
另一个解决这个问题的好方法是在 StackPanel 周围放置一个 ScrollViewer

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