2010-06-08 103 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