Silverlight AutoCompleteBox занимает много времени, чтобы ответить на первый «поиск» - PullRequest
0 голосов
/ 28 октября 2009

У меня есть приложение Silverlight, которое загружает около 2000 объектов с полдюжины полей в AutoCompleteBox. Затем фильтр устанавливается для поиска по любому из четырех полей. Я установил его, чтобы начать поиск после двух символов.

Однако, когда я набираю второй символ (когда поле должно начинаться заполняться) в первый раз после заполнения Списка объектов, AutoCompleteBox для ответа требуется около 6-7 секунд.

Есть идеи, как мне это оптимизировать?

Есть ли способ создать эти визуальные элементы сразу после заполнения списка вместо ожидания, когда пользователь начнет печатать?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2012

Это ошибка в AutoCompleteBox control.

Когда DropDown открывается впервые, Виртуализация пользовательского интерфейса не используется, и элемент управления создает все элементы.

Чтобы исправить это, вы должны установить MaxHeight на Сетка раскрывающегося списка Всплывающее окно в AutoCompleteBox ControlTemplate . Это часть XAML этого шаблона 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>

Это работает для меня.

2 голосов
/ 29 октября 2009

Вы уже настроили свойство MinimumPrefixLength? Чем больше символов вам потребуется, тем лучше будет фильтрация.

Прямо сейчас, с низким префиксом, у вас есть более 2000 визуальных элементов, созданных, за исключением одного символа фильтрации, независимо от других оптимизаций.

Другой вариант - реализовать собственную фоновую фильтрацию потоков, но это устраняет многие из целей управления (т. Е. Простота).

...