2010-06-08 135 views
3

我正面臨性能問題,擁擠的組合框(5000個項目)。下拉列表的渲染速度非常慢(就好像它在顯示任何內容之前計算了全部項目)。Silverlight組合框性能問題

你有什麼訣竅可以讓這個下拉菜單顯示爲懶惰嗎?

XAML代碼:

<Grid x:Name="LayoutRoot"> 
     <StackPanel Orientation="Horizontal" Width="200" Height="20"> 
      <TextBlock>Test Combo </TextBlock> 
      <ComboBox x:Name="fooCombo" Margin="5,0,0,0"></ComboBox> 
     </StackPanel> 
    </Grid> 

代碼後面:

公共的MainPage() { 的InitializeComponent();

List<string> li = new List<string>(); 

    int Max = 5000; 
    for (int i = 0; i < Max; ++i) 
     li.Add("Item - " + i); 

    fooCombo.ItemsSource = li; 
} 

嗯,好像是在ComboBox UI虛擬化a bug,所以一個autocompletebox應該要走的路。

回答

2

改爲使用AutoCompleteBox,在填充下拉列表之前調整需要輸入的字符數,以限制任何時候需要多少下拉項目。

+0

這的確是一種解決方法,我會考慮這一點。 – Vinzz 2010-06-08 14:21:19

+1

@Vinzz:不知道是否有一個真正的解決方案(如果這只是一個解決方法),因爲需要填充100個組合框,更不用說1000個項目,這首先不是一個很好的UI設計決策。 – AnthonyWJones 2010-06-08 14:30:37

6

如果你想要一個實際的組合框(而不是AutoCompleteBox),你可以用VirtualizingStackPanel替換ItemsTemplate。在您的例子,這會看起來像:

<ComboBox x:Name="fooCombo" Margin="5,0,0,0"> 
    <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel></VirtualizingStackPanel> 
     </ItemsPanelTemplate> 
    </ComboBox.ItemsPanel> 
</ComboBox> 

作爲指導,雖然,我可能會檢查您的使用場景看ComboBox是否是適合你的正確的控制 - 自5000個項目似乎是一個強大很多爲一個下拉列表。

順便說一句,緩慢是在Silverlight中預期的行爲,而不是一個錯誤。

+0

這是更好的答案。 – 2013-02-21 23:42:16

+0

這在SL5中不起作用,小心!我在SL4項目中使用它,升級後崩潰了。 http://connect.microsoft.com/VisualStudio/feedback/details/715111/silverlight-5-combobox-problem – katit 2013-08-02 19:28:11