2010-09-30 100 views
3

这是我的组合框。它似乎没有虚拟化,但我无法弄清楚原因。你知道任何会导致这种情况的东西吗?WPF:什么会导致ComboBox无法虚拟化?

<ComboBox Grid.Row="0" Grid.Column="2" 
    SelectedValuePath="PrimaryKey" 
    SelectedValue="{Binding CustomerKey}" 
    ItemsSource="{Binding CustomerCanidates}"> 
    <ComboBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel/> 
     </ItemsPanelTemplate> 
    </ComboBox.ItemsPanel> 
</ComboBox> 

回答

3

检查应用于控制的样式。例如,Microsoft的“亮蓝色”风格被定义为这样的:

<ControlTemplate x:Key="ComboBoxTextBox" TargetType="{x:Type TextBox}"> 
    <Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}"/> 
</ControlTemplate> 


<Style TargetType="{x:Type ComboBox}"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="Template" Value="{DynamicResource ComboBoxTemplate}" /> 
</Style> 

<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid> 
     <ToggleButton Grid.Column="2" Template="{DynamicResource ComboBoxToggleButton}" x:Name="ToggleButton" Focusable="false" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/> 
     <ContentPresenter HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="ContentSite" VerticalAlignment="Center" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" IsHitTestVisible="False"/> 

     <TextBox Visibility="Hidden" Template="{DynamicResource ComboBoxTextBox}" HorizontalAlignment="Left" Margin="3,3,23,3" x:Name="PART_EditableTextBox" Style="{x:Null}" VerticalAlignment="Center" Focusable="True" Background="Transparent" IsReadOnly="{TemplateBinding IsReadOnly}"/> 

     <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide"> 
      <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True"> 
       <Border x:Name="DropDownBorder" Background="{DynamicResource ShadeBrush}" BorderBrush="{DynamicResource SolidBorderBrush}" BorderThickness="1"/> 
       <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True"> 

        <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained"/> 

       </ScrollViewer> 
      </Grid> 
     </Popup> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger Property="HasItems" Value="false"> 
      <Setter Property="MinHeight" Value="95" TargetName="DropDownBorder"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/> 
     </Trigger> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
     </Trigger> 
     <Trigger Property="AllowsTransparency" SourceName="Popup" Value="true"> 
      <Setter Property="Margin" Value="0,0,0,0" TargetName="DropDownBorder"/> 
      <Setter Property="CornerRadius" TargetName="DropDownBorder" Value="3,3,3,3"/> 
     </Trigger> 
     <Trigger Property="IsEditable" Value="true"> 
      <Setter Property="IsTabStop" Value="false"/> 
      <Setter Property="Visibility" Value="Visible" TargetName="PART_EditableTextBox"/> 
      <Setter Property="Visibility" Value="Hidden" TargetName="ContentSite"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

仅仅从一个StackPanel将其更改为一个VirtualizingStackPanel固定我的问题。

1

尝试过设置此属性:

<ComboBox VirtualizingStackPanel.IsVirtualizing="True" 
+0

唉,没有改变它。 – 2010-09-30 23:22:40

+0

嗯,这很奇怪。这在TreeViews和ListViews/Boxes中一直适用于我。从来没有尝试过ComboBoxes,但我不明白为什么它不会工作。 – Carlo 2010-09-30 23:23:44

+0

原来这是样式表中的东西。我会尽快更新我的问题。 – 2010-09-30 23:26:35