【问题标题】:Silverlight AutoCompleteBox takes a long time to respond on first "search"Silverlight AutoCompleteBox 需要很长时间才能响应第一次“搜索”
【发布时间】:2009-10-28 17:47:43
【问题描述】:

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

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

关于如何优化它的任何想法?

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

【问题讨论】:

    标签: silverlight silverlight-3.0 autocomplete delay


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已将 MinimumPrefixLength 设置为 2,如果可能的话,我想保留它。有没有办法在拉入列表后创建这些视觉元素,而不是等到用户开始输入?在将列表指定为数据源后,我尝试向 Text 属性添加两个常用字符,但没有帮助。
    【解决方案2】:

    这是 AutoCompleteBox 控件中的错误。

    第一次打开 DropDown 时,UI Virtualization 没有使用,控件创建所有项目。

    要解决此问题,您必须在 AutoCompleteBox ControlTemplate 中将 MaxHeight 设置为 Grid 的下拉 Popup。这是此 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>
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多