Некоторые вопросы wpf Font_Combobox - PullRequest
0 голосов
/ 22 августа 2010

У меня есть этот код:

  <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, не центрированы вертикально

Как я могу изменить эти 3 вещи?

UPDATE :

 <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>

Хм 2 из 3 ответов были правильными, и они были самыми простыми, это теперь решение?: O У вас есть несколько классных комбо-советов в магазине?Тогда я бы отметил это как решение, иначе вы получите очко; -)

кстати.Поздравляю с вашей новой работой wpf Прочитайте это в своем блоге, я вам завидую!

1 Ответ

1 голос
/ 22 августа 2010
  1. Два варианта - а.) Не очень красиво: установить фиксированную высоту в TextBlock или б) поместить элементы в сетку следующим образом:

    <ComboBox ... Grid.IsSharedSizeScope="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinistions>
                        <RowDefinition Height="Auto" SharedSizeGroup="Row"/>
                    <Grid.RowDefinistions>
                    <TextBlock .../>
                 <Grid>
             <DataTemplate>
         <ComboBox.ItemTemplate>
    
  2. Опять же - два варианта: a) Установить фиксированную ширину TextBlock в DataTemplate. б) Если вы замените VirtualizingStackPanel на StackPanel и сделаете то же самое для ColumnDefinition выше (это будет проблемой производительности, если у вас много в вашем списке, так как при загрузке будут созданы все визуальные элементы.

  3. Поместите VerticalAlignment = "Center" в TextBlock внутри DataTemlate.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ:

Спасибо :). Я дам вам несколько советов:

При использовании VirtualizingStackPanel почти во всех случаях следует установить VirtualizationMode = "Recycling" - то же самое относится и к другим ItemsControls:

<ListBox VirtualizingStackPanel.VirtualiationMode="Recycling"/>
<VirtualizingStackPanel VirtualizationMode="Recycling"/>

Это перезапустит DataTemplate, когда пользователь прокручивает список. Особенно в больших наборах данных или со сложными шаблонами данных это значительно облегчает работу. IsEditable = "True" уничтожает это преимущество (это известная ошибка).

Обычно, когда вы хотите использовать только одно свойство в качестве 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 - в основном, я использую его для значений Enum и очень маленьких наборов данных. Проблема с ComboBox в том, что он очень плохо поддерживает подкачку страниц - для больших наборов данных я обычно использую AutoCompleteBox из WPF Toolkit или ListBox с TextBox над ним для фильтрации.

Надеюсь, у вас есть несколько подсказок: -)

...