【问题标题】:WPF: Getting a list box to stay putWPF:让列表框保持不变
【发布时间】:2009-09-18 17:22:23
【问题描述】:

我有这种情况,我有一个 ListBox,它是从后台线程填充的(它是一个地址簿,数据来自 AD)。

问题在于,由于列表已排序(使用CollectionViewSource)并且在检索更多数据时也可供用户使用,因此当新项目被插入到列表的各个位置时,它会在整个地方弹跳。因此它可供用户使用,但由于用户的选择一直不在视野范围内,因此大多数情况下无法使用。

有没有办法将Focus 保留在所选项目上,并保留所选内容,即使从后台线程中将项目插入到所选内容的上方和下方?我不想在服务器上进行排序,我知道这对于 AD 来说可能是一件坏事。

【问题讨论】:

  • 是否可以填充列表,然后开始工作?或者数据可以随时到达?
  • 理想情况下(按照预期)是,随着更多结果的出现,他们可以处理部分结果。我不想让他们在填充列表框时等待几分钟。跨度>

标签: wpf user-interface listbox focus selecteditem


【解决方案1】:

我将从 UI 设计的角度而不是技术代码的角度对此作出回应。 (我相信其他人会有办法让列表框保持所选项目)

我认为在向其中添加大量数据的同时使用列表框是不可能做得很好的。假设您确实可以让选择保持在视图中,那么当用户仍在搜索他们所需的项目时,您将无法保持它不动。

首先,如果预期的总加载时间低于 10 秒,您可以禁用列表框,直到加载完成。 (显然用旋转动画或其他东西将其变灰,以便用户可以看到它正在做某事。)我假设您已经取消了此选项,否则您可能不会在这里询问。但我确实认为这是值得考虑的。如果加载时间非常短,请考虑您的用户是否真的可以通过在列表仍在加载时浏览列表来获得任何好处。

其次,我建议您找到一种方法来限制列表框的内容,以便一次只显示少量的内容。您可以通过仅显示以单个字母开头的名称(以及字母选择控件)来完成此操作。或者,您可以在顶部提供一个过滤器条目文本框,用户可以在其中键入前几个字母,并且列表框将仅显示以这些字母开头的名称。这将允许用户键入“sa”,列表框将显示“sam”、“samantha”、“sacha”等。现在列表中只有少量项目,因此您不必担心它跳来跳去。如果列表中的项目数量增长过大(由于后台线程加载)并且列表超出了框的高度,用户只需输入一个额外的字母来进一步过滤列表。

很抱歉,如果这不是您真正想要的,但我认为值得提出替代设计,以防您忽略了它。

【讨论】:

  • 谢谢。我确实同意您的说法,但是您将如何亲自实施具有数十万条目的通讯簿(想想 Exchange 通讯簿,尽管在这种情况下它来自 AD)?一个类似于 Outlook 的通讯簿是有意义的。人们必须选择一个字母才能找到名字真的很烦人,通常从 UI 设计的角度来看,点击次数越少越好。说到本地化,你真的要从 40,000+ 中选择一个日文还是中文?
  • 要继续,我确实实现了一个过滤器,但我希望它过滤显示数据。它减轻但不能消除问题。我不希望它返回服务器并导致传输新数据集。此外,加载时间从 15 秒到 15 秒不等,具体取决于 AD 服务器当时的感受。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多