1

我正在编写一个 Silverlight 应用程序,该应用程序查询 Web 服务以填充树控件。每个元素将至少有 2 级子级,因此如下所示:

a
+-b
  +-c
d
+-g
  +-h
e
+-i
  +-j
f
+-k
  +-l

Web服务API是这样的,我一次只能得到一个级别的子节点,所以第一次旅行,我可以得到a,d,e,f。要获得 b,g,i,k,我必须进行 4 次旅行。同样,我必须再进行 4 次旅行才能获得 c、h、j、l。(该服务实际上允许我在一次旅行中获取所有节点,但它并没有给我提供父子关系:-()

我的问题是:我应该让用户在获取树视图的所有节点时提前等待一段时间,还是应该只获取前几个节点,然后按需获取其他节点,或者在后台获取任务?此外,节点可以异步更改,所以如果我提前获取所有节点,我需要一个树视图的“刷新”按钮,如果我按需执行,我将必须有一个缓存策略。

哪个最适合用户?

4

3 回答 3

1

一种折衷方案,您预先加载第一个级别,然后根据需要在后台加载其余项目,由按需覆盖。如果您首先加载节点宽度(例如 a,d,e,f 然后 b,g,i,k)而不是深度优先(例如 a,d,e,f 然后 b,c),您可以将加载重定向到专注于最近扩展的节点。

于 2009-04-26T21:21:31.510 回答
0

简短的回答是让用户尽可能少地等待。如果他们在应用程序加载时必须等待 10-20 秒,他们会诅咒你的名字,但不会注意到树节点扩展需要 0.1-0.2 秒。

我有一个具有类似结构的生产应用程序。我无法预先加载,因为它会有效地加载整个数据库。这是我的策略:

  • 树控件从根下方展开的 1 级开始。
  • 每个未展开的节点都有一个虚拟子节点,以便显示 [+] 展开图标
  • 当一个节点展开时,它会触发一个被应用程序捕获的事件。如果唯一的子节点是虚拟节点,则删除虚拟节点并从数据库中加载子节点。
  • 可见节点不会自动反映数据的变化,但是树的上下文菜单有一个刷新项,可用于刷新节点。

我考虑过异步显示更新,但倾向于避免它,因为大量数据可以显示在树中,如果我要检查它们是否有变化,我会警惕数据库负载。

该应用程序是 WinForms,使用 .NET 2.0 用 C# 编写。

于 2009-04-28T06:33:09.770 回答
0

就个人而言,作为用户,我更希望预先加载所有数据,这样一旦应用程序完成加载,我就可以相信我不再需要等待(或者至少很少等待)

但是,我想这取决于您的应用程序/数据的几个特征:

  • 数据的动态性如何?它的更新频率是否高于用户浏览节点的频率? 如果是这样,那么您将不得不在用户浏览数据时读取数据,否则您可能只能偶尔更新它并在执行重要操作之前检查最新数据。
  • 用户在正常使用过程中会探索多少数据? 如果他们不断探索整棵树,那么加载整棵树很重要。另一方面,如果大多数用户通常只会扩展树的一小部分,那么按需加载可能会更好,这样您就不会浪费时间加载他们永远不会看到的数据。
  • 这对性能有多大影响?加载所有数据真的需要很长时间吗? 如果数据不是太多,也许整个东西可以在几秒钟内加载,在这种情况下,实现优化的工作量对最终用户来说并不重要,反过来也不会有很好的回报投资。

很可能您对这些问题没有明确的答案,但是当您解决这个有趣的问题时,它们可能是很好的考虑因素。

于 2009-04-28T06:21:45.523 回答