我有一个 Silverlight 应用程序,它将大约 2000 个包含六个字段的对象加载到 AutoCompleteBox 中。然后将过滤器设置为搜索四个字段中的任何一个。我已将其设置为在两个字符后开始搜索。
但是,当我在填充对象列表后第一次键入第二个字符(该框应该开始填充时)时,AutoCompleteBox 需要大约 6-7 秒来响应。
关于如何优化它的任何想法?
有没有办法在填充列表后立即创建这些视觉元素,而不是等待用户开始输入?
我有一个 Silverlight 应用程序,它将大约 2000 个包含六个字段的对象加载到 AutoCompleteBox 中。然后将过滤器设置为搜索四个字段中的任何一个。我已将其设置为在两个字符后开始搜索。
但是,当我在填充对象列表后第一次键入第二个字符(该框应该开始填充时)时,AutoCompleteBox 需要大约 6-7 秒来响应。
关于如何优化它的任何想法?
有没有办法在填充列表后立即创建这些视觉元素,而不是等待用户开始输入?
您是否已经调整了 MinimumPrefixLength 属性?您需要的字符越多,过滤效果就会越好。
现在,使用低前缀,您可以创建 2000 多个视觉元素,减去一个过滤字符,而不管任何其他优化。
另一种选择是实现您自己的后台线程过滤,但这会破坏控制的许多目的(即简单性)。
这是AutoCompleteBox控件中的错误。
首次打开 DropDown 时,不使用UI 虚拟化,控件会创建所有项目。
要解决此问题,您必须在 AutoCompleteBox ControlTemplate中将MaxHeight设置为下拉弹出窗口的网格。这是此 ControlTemplate 的 XAML 部分:
<ControlTemplate TargetType="sdk:AutoCompleteBox">
<Grid Opacity="{TemplateBinding Opacity}">
...
<Popup x:Name="Popup">
<Grid Opacity="{TemplateBinding Opacity}" MaxHeight="450">
<Border x:Name="PopupBorder" BorderThickness="0" Background="#11000000" HorizontalAlignment="Stretch" Opacity="0">
<Border.RenderTransform>
<TranslateTransform X="1" Y="1"/>
</Border.RenderTransform>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0" HorizontalAlignment="Stretch" Opacity="1.0" Padding="0">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFDDDDDD" Offset="0"/>
<GradientStop Color="#AADDDDDD" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Border.RenderTransform>
<TransformGroup>
<TranslateTransform X="-1" Y="-1"/>
</TransformGroup>
</Border.RenderTransform>
<ListBox x:Name="Selector" BorderThickness="0" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" ScrollViewer.HorizontalScrollBarVisibility="Auto" ItemTemplate="{TemplateBinding ItemTemplate}" ItemContainerStyle="{TemplateBinding ItemContainerStyle}" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
</Border>
</Border>
</Grid>
</Popup>
</Grid>
</ControlTemplate>
这对我有用。