0

AutoCompleteBoxに半ダースのフィールドの約2000個のオブジェクトをロードするSilverlightアプリケーションがあります。次に、フィルターは4つのフィールドのいずれかを検索するように設定されます。2文字後に検索を開始するように設定しました。

ただし、オブジェクトのリストを入力した後、初めて2番目の文字を入力すると(ボックスが入力を開始することになっている場合)、AutoCompleteBoxが応答するのに約6〜7秒かかります。

これを最適化する方法について何かアイデアはありますか?

ユーザーが入力を開始するのを待つのではなく、リストが入力された直後にこれらの視覚要素を作成する方法はありますか?

4

2 に答える 2

2

AutoCompleteBoxコントロールのバグです。

DropDownを初めて開くと、UI仮想化は使用されず、コントロールによってすべてのアイテムが作成されます。

これを修正するには、AutoCompleteBoxControlTemplateで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>

これは私のために働きます。

于 2012-11-30T13:10:31.980 に答える
2

既に MinimumPrefixLength プロパティを調整しましたか? 必要な文字数が多いほど、フィルタリングは改善されます。

現在、プレフィックスが低いため、他の最適化に関係なく、2000 以上のビジュアル要素が作成され、フィルター処理の 1 文字などを差し引いています。

もう 1 つのオプションは、独自のバックグラウンド スレッド フィルタリングを実装することですが、これでは制御の多くの目的 (単純さ) が損なわれます。

于 2009-10-28T21:42:38.070 に答える