【问题标题】:WPF: ItemsControl with scrollbar (ScrollViewer)WPF:带有滚动条的 ItemsControl (ScrollViewer)
【发布时间】:2011-01-02 23:05:49
【问题描述】:

我按照this 小“教程”介绍了如何向 ItemsControl 添加滚动条,它在设计器视图中有效,但在我编译和执行程序时不起作用(只显示前几个项目,没有滚动条查看更多 - 即使 VerticalScrollbarVisibility 设置为“Visible”而不是“Auto”)。

你知道如何解决这个问题吗?


这是我用来显示我的项目的代码(通常我使用数据绑定,但为了在我的设计器中查看项目,我手动添加了它们):

<ItemsControl x:Name="itemCtrl" Style="{DynamicResource UsersControlStyle}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Top">
            </StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
    <uc:UcSpeler />
</ItemsControl>

这是我的模板:

<Style x:Key="UsersControlStyle" TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                    <ScrollViewer VerticalScrollBarVisibility="Visible">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

    标签: wpf wpf-controls itemscontrol scrollviewer


    【解决方案1】:

    将您的 ScrollViewer 放入 DockPanel 并设置 DockPanel MaxHeight 属性

    [...]
    <DockPanel MaxHeight="700">
      <ScrollViewer VerticalScrollBarVisibility="Auto">
       <ItemsControl ItemSource ="{Binding ...}">
         [...]
       </ItemsControl>
      </ScrollViewer>
    </DockPanel>
    [...]
    

    【讨论】:

      【解决方案2】:

      要获得ItemsControl 的滚动条,您可以将其托管在ScrollViewer 中,如下所示:

      <ScrollViewer VerticalScrollBarVisibility="Auto">
        <ItemsControl>
          <uc:UcSpeler />
          <uc:UcSpeler />
          <uc:UcSpeler />
          <uc:UcSpeler />
          <uc:UcSpeler />
        </ItemsControl>
      </ScrollViewer>
      

      【讨论】:

      • 当您看到它时,它是如此明显...由于我来自 Windows 窗体,我经常发现自己陷入了错误的心态。似乎 WPF 纠正了很多错误...... +1。
      • 谢谢 - 非常有帮助。我同意 Lette 的观点,即我的 WinForms 大脑最初并没有“理解”这一点。
      • 我刚刚在这里尝试过,但仍然无法正常工作。 ItemsControl 直接从其父容器流出,根本看不到任何 ScrollBar。
      • @Ristogod 如果您将 ScrollViewer 托管在允许其内容根据需要增长的东西中,例如 StackPanel,滚动将不起作用。什么是父容器?尝试在 ScrollViewer 或父级上设置固定高度,这有帮助吗?
      • @Rod 您可以将 ScrollViewer 托管在 DockPanel 或 Grid 中,而不是 StackPanel 以实现此目的。
      【解决方案3】:

      您必须修改控件模板而不是 ItemsPanelTemplate:

      <ItemsControl >
          <ItemsControl.Template>
              <ControlTemplate>
                  <ScrollViewer x:Name="ScrollViewer" Padding="{TemplateBinding Padding}">
                      <ItemsPresenter />
                  </ScrollViewer>
              </ControlTemplate>
          </ItemsControl.Template>
      </ItemsControl>
      

      也许,您的代码无法正常工作,因为 StackPanel 有自己的滚动功能。尝试使用StackPanel.CanVerticallyScroll 属性。

      【讨论】:

      • StackPanel CanVerticallyScroll 属性不起作用,恐怕。
      • StackPanel CanVerticallyScroll 不起作用,但此处给出的代码示例对我有用。谢谢
      • 这行得通。我正在寻找在里面而不是在外面制作滚动查看器,因为github.com/punker76/gong-wpf-dragdrop 需要它。
      猜你喜欢
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2023-03-30
      相关资源
      最近更新 更多