【问题标题】:How can a WPF ListBox, with a custom ItemsPanel template, resize itself based on the size of its items带有自定义 ItemsPanel 模板的 WPF ListBox 如何根据其项目的大小调整自身大小
【发布时间】:2009-10-09 21:24:01
【问题描述】:

这是this 的后续问题,已得到答复。

使用代码:

<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel Orientation="Vertical"/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

您可以创建一个列表,其中项目从左到右填充列中的ListBox,并且特定列中的最后一个项目永远不会被截断(这意味着如果项目太高不适合,它会被移动到顶部下一栏)。我现在如何动态调整 ListBoxWidth 以“适合”它的项目并水平获得相同的行为。所以假设如下:

如果在给定的Height 处,只需要一个Column 即可容纳所有项目,那么ListBox 中的Width 应该是项目中Width 的大小。

或者,对于给定的Height,需要有四个Columns,它的大小需要是项目的Width 的四倍。

最后,假设在给定的Height 处,Columns 需要比 ListBox 中允许的最大Width 多,它需要计算它应该有多宽,以便无法适应的Columns 不会被截断,只是在用户向右滚动之前不会显示。

感谢您的帮助!!

编辑:

我认为表达上述内容的一种更简单的方法是,我正在寻找一种方法来避免“剪切”列表中的项目。我想创建一个在网格中显示项目的列表,但您不必滚动,因为某些项目被部分覆盖,并且需要您向右或向左滚动才能看到该项目的其余部分(尽管列表只能这么宽或这么高,如果有足够的项目你仍然需要滚动才能看到所有项目,你看到的任何项目都应该完全显示)。另外我只关心列表的初始绘制。它不必“对齐”项目以始终适合,但它应该能够滚动,以便它显示的项目完全填充可用空间。

在我看来,这样做的关键是在运行时计算出列表项的大小以及列表框中内容容器的大小,然后您可以在列表是最初绘制的?

谢谢!

【问题讨论】:

  • 您能否在网络上某个地方发布您想要的行为示例...目前尚不清楚您的要求是什么。
  • 假设我有一个类似本示例中的列表:windowsclient.net/learn/video.aspx?v=29384,我该如何更改该示例,以便在它第一次显示列表时只能看到完全可见的项目?完全可见是指其中一个框的一部分不应被容器的末端覆盖,以至于您必须滚动才能看到所有该项目。希望有帮助!

标签: c# wpf listbox autosize itemspaneltemplate


【解决方案1】:

这是一个相当复杂的问题。我不能 100% 确定您要在这里完成什么...您看到的列数是否需要随着高度的增加而增加或减少?我希望减少,但是您提出问题的方式似乎是相反的,我正在努力理解这一点。

我认为在尝试理解这些问题时,对 WPF 布局系统的基本了解非常有用。另一件有用的事情是,事物的大小很大程度上取决于其布局容器,而不是事物本身。

在您的问题中,您询问如何让您的 ListBox 根据内容动态调整大小。 ListBox 不是布局控件,而是类似于 WrapPanel 的东西。 WrapPanel 的功能是说在相同的宽度上,即使 Panel 的内容增加了大小。这与其他控件不同,例如 Grid。

这里有几个关于 WPF 中布局系统的好链接。希望这会有所帮助。回来澄清您的问题,看看如果您需要,我们能否为您提供更多帮助。

http://www.wpftutorial.net/LayoutProperties.html http://msdn.microsoft.com/en-us/library/ms745058.aspx

【讨论】:

  • 感谢您的帮助 (+1),这些网站看起来非常有用!我将根据您的反馈编辑问题,看看是否可以更清楚。
猜你喜欢
  • 1970-01-01
  • 2011-11-13
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多