2009-10-28 4 views
0

저는 AutoCompleteBox에 약 6,000 개의 개체를로드하는 Silverlight 응용 프로그램이 있습니다. 필터는 네 개의 필드 중 하나를 검색하도록 설정됩니다. 나는 두자를 뒤쫓아 가기 시작했다.Silverlight AutoCompleteBox는 첫 번째 "검색"에서 응답하는 데 오랜 시간이 걸립니다.

그러나 개체 목록을 채운 후 두 번째 문자 (상자 채우기를 시작할 때)를 처음 입력하면 자동 완성 상자에 약 6-7 초가 소요됩니다.

어떻게 최적화 할 수 있습니까?

사용자가 입력을 기다리지 않고 목록이 채워진 직후에 이러한 시각적 요소를 만드는 방법이 있습니까?

답변

2

MinimumPrefixLength 속성을 조정 했습니까? 필요한 문자가 많을수록 필터링이 향상됩니다.

지금은 낮은 접두어로 다른 최적화에 관계없이 필터링의 한 문자를 제외하고 생성 된 2000+ 시각적 요소가 있습니다.

또 다른 옵션은 사용자 고유의 백그라운드 스레드 필터링을 구현하는 것입니다. 그러나이 방법은 컨트롤의 여러 목적 (단순함)을 무효화합니다.

+0

MinimumPrefixLength를 2로 설정 했으므로 가능한 경우 유지하려고합니다. 사용자가 입력하기 시작할 때까지 기다리지 않고 목록을 끌어 와서 시각적 요소를 만드는 방법이 있습니까? 목록이 데이터 소스로 지정되었지만 두 개의 일반 문자를 Text 속성에 추가하려고 시도했지만 도움이되지 않았습니다. – Feckmore

2

자동 완성 상자 컨트롤에 버그가 있습니다.

처음으로 DropDown을 열면 UI 가상화이 사용되지 않고 컨트롤이 모든 항목을 만듭니다.

는 AutoCompleteBox 은 ControlTemplate그리드 드롭 다운 팝업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> 

이것은 저에게 효과적입니다.

관련 문제