我有这段代码:
<ComboBox Width="100" ItemsSource="{Binding FontList}" x:Name="fontComboFast">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" FontFamily="{Binding }" FontSize="12" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Combobox中有3个陷阱。
我怎样才能改变这三件事?
更新:
<ComboBox AlternationCount="2" Width="200" ItemContainerStyle="{StaticResource alternateColor}" ItemsSource="{Binding Source={x:Static Member=Fonts.SystemFontFamilies}}" x:Name="fontComboFast">
<Style x:Key="alternateColor" TargetType="{x:Type ComboBoxItem}">
<Style.Setters>
<Setter Property="Height" Value="30" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="FontSize" Value="16" />
</Style.Setters>
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="LightGray"/>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="AliceBlue"/>
</Trigger>
</Style.Triggers>
</Style>
Hm 2的3个答案是正确的,他们是最容易的,现在这是一个解决方案吗? :o 你有一些很酷的组合框技巧吗?然后我会把它标记为解决方案,否则你得到一个观点; - )
顺便说一句。恭喜你的新wpf工作在你的博客上阅读,我很羡慕你!
答案 0 :(得分:1)
两个选项 - a。)不太漂亮:在TextBlock中设置固定高度或b)将项目放在Grid中,如下所示:
<ComboBox ... Grid.IsSharedSizeScope="True">
<ComboBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinistions>
<RowDefinition Height="Auto" SharedSizeGroup="Row"/>
<Grid.RowDefinistions>
<TextBlock .../>
<Grid>
<DataTemplate>
<ComboBox.ItemTemplate>
再次 - 两个选项:a)在DataTemplate中设置TextBlock的固定宽度。 b)如果用StackPanel替换VirtualizingStackPanel并对上面的ColumnDefinition执行相同的操作(如果列表中有很多,这将是性能问题,因为它会在加载时创建所有可视元素。
将VerticalAlignment =“Center”放在DataTemlate内的TextBlock中。
希望这有帮助。
编辑:
谢谢:)我会给你一些提示:
使用VirtualizingStackPanel时,几乎在所有情况下都应该设置VirtualizationMode =“Recycling” - 顺便说一下其他ItemsControls也是如此:
<ListBox VirtualizingStackPanel.VirtualiationMode="Recycling"/>
<VirtualizingStackPanel VirtualizationMode="Recycling"/>
当用户滚动列表时,这将回收DataTemplate。特别是在大型数据集或复杂的DataTemplates中,这将提供相当平滑的体验。 IsEditable =“True”破坏了这个好处(这是一个已知的bug)。
通常,当您只想使用一个属性作为DataTemplate时,可以使用DisplayMemberPath - 这将为您提供键盘加速器(键入“T”将滚动到以T开头的第一个项目等)如果您使用DataTemplates - 您可以使用TextSearch.TextPath实现相同的目的。只需记住将组合框中的项目排序到您在TextPath中使用的相同属性 - 否则,用户会遇到“颠簸”的体验,因为它似乎会随机跳转到列表中。
如果要为列表中的每个第二项着色 - 您可以按如下方式实现:
<UserControl.Resources>
<Style TargetType="{x:Type ComboBoxItem}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="LightGray"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ComboBox AlternationCount="2">
实际上,我并没有真正使用ComboBox - 主要是,我将它用于枚举值和非常小的数据集。 ComboBox的问题在于它支持分页效果很差 - 对于大型数据集,我通常使用WPF Toolkit中的AutoCompleteBox或带有上面TextBox的ListBox进行过滤。
希望你在那里得到一些提示: - )