2010-08-21 5 views
0

Je possède ce code:Quelques questions WPF de Font_Combobox

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

Il y a 3 gotchas dans ce Combobox.

  1. Les éléments/polices ont une hauteur différente
  2. Quand je défiler vers le haut/bas la scrollviewer`s largeur augmente/diminue en fonction de la longueur du plus long élément visible dans le ScrollViewer. Comment puis-je définir une largeur fixe?
  3. Les polices alias TextBlocks ne sont pas centrées verticalement

Comment puis-je changer ces 3 choses?

MISE À JOUR:

<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 de 3 réponses avaient raison et ils ont été les plus faciles est-ce maintenant une solution? : O Vous avez des astuces de combobox en magasin? Alors je marquerais cela comme solution sinon vous obtenez un point ;-)

btw. Félicitations à votre nouveau travail wpf lu sur votre blog, je vous envie!

Répondre

1
  1. Deux options - a) Le pas si jolie. Définir une hauteur fixe dans le TextBlock ou b) mettre les éléments à l'intérieur d'une grille comme ceci:

    <ComboBox ... Grid.IsSharedSizeScope="True"> 
        <ComboBox.ItemTemplate> 
         <DataTemplate> 
          <Grid> 
           <Grid.RowDefinistions> 
            <RowDefinition Height="Auto" SharedSizeGroup="Row"/> 
           <Grid.RowDefinistions> 
           <TextBlock .../> 
          <Grid> 
         <DataTemplate> 
        <ComboBox.ItemTemplate> 
    
  2. Encore une fois - deux options: a) Définissez une largeur fixe du TextBlock dans le DataTemplate. b) Si vous remplacez le VirtualizingStackPanel avec un StackPanel et faites de même pour la ColumnDefinition ci-dessus (ce sera un problème de performance si vous avez beaucoup de choses dans votre liste car il créera tous les éléments visuels lors du chargement.)

  3. Mettez VerticalAlignment . = "center" dans le TextBlock à l'intérieur du DataTemlate

Hope this helps

EDIT:.

Merci :). Je vais vous donner quelques conseils:

Lorsque vous utilisez le VirtualizingStackPanel, dans presque tous les cas, vous devez définir VirtualizationMode = « Recyclage » - va de même pour les autres ItemsControls de la façon suivante:

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

Cette volonté recycler les DataTemplate lorsque l'utilisateur fait défiler la liste. Surtout dans les grands ensembles de données ou avec des DataTemplates complexes, cela donnera une expérience beaucoup plus lisse. IsEditable = "True" détruit cet avantage (c'est un bug connu).

Normalement, lorsque vous ne souhaitez utiliser qu'une seule propriété en tant que DataTemplate, vous pouvez utiliser DisplayMemberPath - et cela vous donnera des raccourcis clavier (en tapant 'T', le premier élément commencera par T, etc.). DataTemplates - vous pouvez obtenir la même chose en utilisant TextSearch.TextPath. N'oubliez pas de trier les éléments de la liste déroulante dans la même propriété que celle que vous utilisez dans le TextPath. Dans le cas contraire, les utilisateurs sont confrontés à une expérience «cahoteuse», car il semble sauter de manière aléatoire dans la liste.

Si vous voulez colorer chaque deuxième élément de la liste - vous pouvez y parvenir comme suit:

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

En fait, je ne l'utilise pas vraiment le ComboBox beaucoup - la plupart du temps, je l'utilise pour Enum -values ​​et très petits jeux de données. Le problème avec ComboBox est qu'il supporte très peu la pagination - avec de grands ensembles de données, j'utilise normalement AutoCompleteBox à partir du WPF Toolkit ou un ListBox avec un TextBox dessus pour le filtrage.

Hope, vous avez obtenu quelques conseils là-dedans :-)

+0

1b.worked PAS 2a.worked 3..worked – Elisabeth

+0

Je posterai une image ici, donc vous savez ce que je veux dire et que vous voyez la mauvaise conduite: http://666kb.com/i/bm0et3s0n9atkmzol.png – Elisabeth

+0

ok je l'ai eu voir ma mise à jour init post. – Elisabeth