2009-10-28 71 views
0

我有一個Silverlight應用程序,它將大約2000個對象的半打字段加載到AutoCompleteBox中。然後設置過濾器搜索四個字段中的任何一個。我已將它設置爲在兩個字符後開始搜索。Silverlight AutoCompleteBox需要很長時間才能對第一個「搜索」做出響應

但是,當我在填充對象列表後第一次鍵入第二個字符(當盒子應該開始填充時)時,AutoCompleteBox需要大約6-7秒的時間才能響應。

關於如何優化這個的任何想法?

有沒有辦法在列表填充後立即創建這些可視元素,而不是等待用戶開始鍵入?

回答

2

你有沒有調整MinimumPrefixLength propery?您需要的字符越多,過濾效果就越好。

現在,使用較低的前綴,您可以創建2000多個可視元素,減去一個過濾字符,無論其他優化如何。

另一種選擇是實現你自己的後臺線程過濾,但是這會失去控制的許多目的(即簡單性)。

+0

我已將MinimumPrefixLength設置爲2,這是我希望在可能的情況下保留它的位置。有沒有辦法在拉入列表後創建這些視覺元素,而不是等到用戶開始鍵入?在列表被指定爲數據源後,我嘗試在Text屬性中添加兩個常用字符,但它沒有幫助。 – Feckmore 2009-10-29 12:39:25

2

這是bug中的AutoCompleteBox控件。

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

這適用於我。

相關問題