ComboBox + VirtualizingStackPanel 宽度错误?

ComboBox + VirtualizingStackPanel width bug?

我们的 Silverlight 应用程序在使用 ComboBox 和 VirtualizingStackPanel 时遇到问题。当 ComboBox 项目的宽度明显宽于控件本身并且项目仅在滚动后可见(即在加载时不可见)时,就会出现问题。对于相当长的项目列表,组合框滚动变得疯狂。

在谷歌上搜索了一下,我只能看到一条描述我们遇到的问题的评论,但我找不到解决办法。这似乎是一个错误,但也许我们做错了什么或者有解决方法。标记很简单,大致如下所示

<ComboBox>
  <ComboBox.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel />
    </ItemsPanelTemplate>
  </ComboBox.ItemsPanel>
</ComboBox>

顺便说一句,ComboBoxItems 是简单的文本。没有图形或其他对象。

我 运行 遇到了同样的问题,最终需要为组合框定义一个项目模板,并强制项目的宽度与外部列宽的宽度相匹配。这会使文本换行到多行,但您可以将其更改为使用 TextTrimming="WordEllipsis" 到 trim 文本项。

<Grid>
  <Grid.ColumnDefinitions>
    ...
    <ColumnDefinition Width="..." x:Name="cbColumn" />
  </Grid.ColumnDefinitions>
  <ComboBox>
    <ComboBox.ItemsPanel>
      <ItemsPanelTemplate>
        <VirtualizingStackPanel />
      </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
    <ComboBox.ItemTemplate>
      <DataTemplate>
        <TextBlock TextWrapping="Wrap" Width="{Binding ActualWidth, ElementName=cbColumn}" />
      </DataTemplate>
    </ComboBox.ItemTemplate>
  </ComboBox>
</Grid>

在我的例子中,我并不总是知道组合框需要多大,所以这就是为什么我使用绑定到网格列的原因。如果您知道组合框的尺寸,直接在项目模板中设置宽度可能同样有效。