一些wpf Font_Combobox问题

时间:2010-08-21 21:11:36

标签: wpf combobox popup

我有这段代码:

  <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个陷阱。

  1. 项目/字体的高度不同
  2. 当我向上/向下滚动时,滚动查看器的宽度会根据滚动查看器中最长可见项目的长度增加/减少。如何设置固定宽度?
  3. 字体又称TextBlocks不是垂直居中的
  4. 我怎样才能改变这三件事?

    更新

     <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工作在你的博客上阅读,我很羡慕你!

1 个答案:

答案 0 :(得分:1)

  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>
    
  2. 再次 - 两个选项:a)在DataTemplate中设置TextBlock的固定宽度。 b)如果用StackPanel替换VirtualizingStackPanel并对上面的ColumnDefinition执行相同的操作(如果列表中有很多,这将是性能问题,因为它会在加载时创建所有可视元素。

  3. 将VerticalAlignment =“Center”放在DataTemlate内的TextBlock中。

  4. 希望这有帮助。

    编辑:

    谢谢:)我会给你一些提示:

    使用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进行过滤。

    希望你在那里得到一些提示: - )