2009-10-14 34 views
1

可以说我有一个包含1000个项目的自动完成框。如何重置Silverlight自动完成框的下拉列表中的位置

  1. 用户首先键入返回广泛结果集的两个字符(例如100个项目)。
  2. 然后,他们滚动到列表的底部,然后...
  3. 然后他们选择关闭下拉菜单的最后一项。
  4. 用户然后返回到自动完成框并输入一个更精确的搜索,返回,比如说25个项目。
  5. 由于先前选择的项目位于下拉框的底部,因此AutoCompleteBox会显示新搜索结果的最后一个元素,而不是显示列表顶部的第一个项目。

如何强制AutoCompleteBox显示从列表中的第一项开始的结果?

+0

AutoCompleteBox会在下拉列表打开和关闭时分析事件。你有没有尝试重置这些事件中的选定项目? – JustLoren 2009-10-14 19:56:41

+0

我想这会触发selecteditemchanged事件,关闭下拉并触发另一系列事情。 – Feckmore 2009-10-14 20:02:40

+0

我回去开始尝试改变dropdownopening事件中的选择项,但意识到我不知道如何。我不知道如何引用列表中正在显示的项目的过滤列表的第一项。有任何想法吗? – Feckmore 2009-10-14 20:40:38

回答

1

这是基于默认控制模板的盲猜。在DropdownOpening事件: -

var sv = ((FrameworkElement)sender).FindName("ScrollViewer") As ScrollViewer; 
if (sv != null) 
    sv.VerticalOffset = 0; 
+0

Ooooh ...太近了。我认为它会工作一分钟,但得到这个错误:“System.Windows.Controls.ScrollViewer.VerticalOffset'不能被分配 - 它是只读的”但谢谢!你只是对我对物体的理解做出了积极的调整。 – Feckmore 2009-10-15 12:15:04

+0

PS ...无论如何,发件人(AutoCompleteBox)中都找不到ScrollViewer。 – Feckmore 2009-10-15 12:20:52

1

我知道这是不是太多的答案,但我想我会分享我发现,即使它并没有解决问题。我在DropDownOpening赛事中尝试了以下所有内容。

  1. SelectedItem设置为空。 - 失败。
  2. 按照安东尼的建议。 - 失败。首先,senderAutoCompleteBox并且不包含ScrollViewer。其次,VerticalOffset是只读的。
  3. 我检查了AutoCompleteBox中的所有变量,发现它有一个名为DropDownPopup的非公有变量,它是System.Windows.Control.PopupHelper的一个实例。尽管我在图书馆找不到它。但是,它包含一个Popup财产,其变量为VerticalOffset。但是,我试图继承AutoCompleteBox,无法访问该变量,因此我怀疑它必须是私有的。