Silverlight AutoCompleteBox需要很长时间来响应第一次“搜索”

时间:2009-10-28 17:47:43

标签: silverlight silverlight-3.0 autocomplete delay

我有一个Silverlight应用程序,它将大约2000个六个字段的对象加载到AutoCompleteBox中。然后将过滤器设置为搜索四个字段中的任何一个。我已将其设置为在两个字符后开始搜索。

但是,当我在填充对象列表后第一次键入第二个字符(当该框应该开始填充时)时,AutoCompleteBox需要大约6-7秒的时间来响应。

关于如何优化这一点的任何想法?

有没有办法在填充列表后立即创建这些可视元素,而不是等待用户开始输入?

2 个答案:

答案 0 :(得分:2)

您是否已经调整了MinimumPrefixLength属性?您需要的字符越多,过滤效果就越好。

现在,使用低前缀,您可以创建2000多个可视元素,减去一个过滤字符,无论其他任何优化。

另一种选择是实现你自己的后台线程过滤,但这会破坏控制的许多目的(即简单性)。

答案 1 :(得分:2)

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>

这适合我。