Domanda

Ho un'applicazione Silverlight che carica circa 2000 oggetti di mezza dozzina di campi in un AutoCompleteBox. Il filtro viene quindi impostato per la ricerca in uno dei quattro campi. L'ho impostato per iniziare la ricerca di due caratteri.

Tuttavia, quando scrivo il secondo carattere (quando la casella dovrebbe iniziare a popolarsi) per la prima volta dopo aver popolato l'Elenco di oggetti, AutoCompleteBox impiega circa 6-7 secondi per rispondere.

Qualche idea su come posso ottimizzare questo?

Esiste un modo per creare questi elementi visivi subito dopo la compilazione dell'elenco anziché attendere che l'utente inizi a digitare?

È stato utile?

Soluzione

Hai già regolato correttamente la MinimumPrefixLength? Più caratteri hai bisogno, il filtro sarà migliore.

In questo momento, con un prefisso basso, hai 2000+ elementi visivi che vengono creati, meno dire un carattere di filtro, indipendentemente da qualsiasi altra ottimizzazione.

Un'altra opzione è quella di implementare il proprio filtro di thread in background, ma ciò vanifica molti degli scopi del controllo (ovvero la semplicità).

Altri suggerimenti

È un bug nel controllo AutoCompleteBox .

Quando DropDown viene aperto per la prima volta, UI Virtualization non viene utilizzato e il controllo crea tutti gli elementi.

Per risolvere questo problema, devi impostare MaxHeight su Griglia del menu a discesa Popup in AutoCompleteBox ControlTemplate . Questa è la parte XAML di questo 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>

Questo funziona per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top