Pregunta

Tengo una aplicación Silverlight que carga alrededor de 2000 objetos de media docena de campos en un AutoCompleteBox. El filtro se configura para buscar en cualquiera de los cuatro campos. Lo configuré para comenzar a buscar dos caracteres.

Sin embargo, cuando escribo el segundo carácter (cuando se supone que el cuadro comienza a llenarse) por primera vez después de llenar la Lista de objetos, el AutoCompleteBox tarda entre 6 y 7 segundos en responder.

¿Alguna idea sobre cómo puedo optimizar esto?

¿Hay alguna forma de crear estos elementos visuales justo después de que se complete la lista en lugar de esperar a que el usuario comience a escribir?

¿Fue útil?

Solución

¿Ya ha ajustado la propiedad MinimumPrefixLength? Cuantos más caracteres requiera, el filtrado será mejor.

En este momento, con un prefijo bajo, tiene más de 2000 elementos visuales que se crean, menos un carácter de filtrado, independientemente de cualquier otra optimización.

Otra opción es implementar su propio filtro de subprocesos en segundo plano, pero eso anula muchos de los propósitos para el control (es decir, simplicidad).

Otros consejos

Es un error en el control AutoCompleteBox .

Cuando se abre DropDown por primera vez, UI Virtualization no se usa y el control crea todos los elementos.

Para solucionar esto, debe establecer MaxHeight en Cuadrícula del menú desplegable Ventana emergente en AutoCompleteBox ControlTemplate . Esto es parte de XAML de este ControlTemplate:

<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>

Esto funciona para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top