2010-02-11 8 views
0

var a1 = "HEL"; var a2 = "BONJOUR"; var a3 = "LLO"; var longueur = a2.Longueur + 5;Texte de remplissage dans la liste déroulante

 listbox.Items.Add(a1.PadRight(length) +"End"); 
     listbox.Items.Add(a2.PadRight(length) + "End"); 
     listbox.Items.Add(a3.PadRight(length) + "End"); 

J'ai un code comme celui-ci pour bien évidemment remplir tout le texte afin que le mot End s'aligne.

Le problème est que je dois changer la police de la liste déroulante wpf de Segoe UI à Courier New pour avoir ce travail. Le reste de mon application utilise Segoe UI, donc je pense que ça a l'air bizarre ici.

Y a-t-il moyen d'obtenir le résultat avec Segoe UI ou une police similaire avec l'espacement correct que je pourrais utiliser, ou peut-être quelqu'un a une autre solution intelligente à laquelle je n'ai même pas pensé? :-)

Merci

modifier

à la fin de la journée je veux cette option pour afficher aux éléments connexes comme ceci:

ITEM A -> ITEM B 
ITEM X -> ITEM Y 
ITEM C -> ITEM E 

ne veux pas utiliser GridView.

Répondre

1

Flux de la zone de liste les deux éléments de données séparément, et utiliser un modèle de données. Voici comment.

D'abord, créer une petite classe pour représenter chaque élément que vous souhaitez insérer:

public class WordPair { 
    public string First { get; set; } 
    public string Second { get; set; } 
} 

(Vous avez probablement déjà une classe appropriée et/ou d'une collection dans votre application - Je suppose que les paires de chaînes sont ! venant de quelque part)

Deuxièmement, définissez votre ListBox.ItemsSource à une collection de ces choses:

listBox.ItemsSource = new List<WordPair> { 
    new WordPair { First = "ITEM A", Second = "ITEM B" }, 
    new WordPair { First = "ITEM X", Second = "ITEM Y" }, 
}; 

Encore une fois, cette collection peut déjà exister dans votre application.

Troisièmement, créer un DataTemplate spécifiant la disposition souhaitée, et l'affecter à votre ListBox.ItemTemplate:

<!-- in your Window.Resources section --> 
<DataTemplate x:Key="AlignedPairs"> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Text="{Binding First}" Grid.Column="0" /> 
    <TextBlock Text="->" TextAlignment="Center" Grid.Column="1" /> 
    <TextBlock Text="{Binding Second}" TextAlignment="Right" Grid.Column="2" /> 
    </Grid> 
</DataTemplate> 

<ListBox Name="listBox" ItemTemplate="{StaticResource AlignedPairs}"> 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
    </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

(je l'ai deviné l'alignement exact que vous voulez pour les articles, mais vous pouvez évidemment modifier Il.)

Notez que vous devez également définir le HorizontalContentAlignment de ListBoxItems à Stretch en utilisant ListBox.ItemContainerStyle. Sinon, chaque ListBoxItem occupera uniquement l'espace dont il a besoin, ce qui entraînera une taille minimale de toutes les colonnes Grid et une concaténation droite. Stretch fait que chaque ListBoxItem remplit toute la largeur, de sorte que les colonnes Grid sont obligées de croître en conséquence.

+0

Avez-vous testé cela? Cela a semblé très prometteur, mais je n'ai pas pu trouver de toute façon pour définir HorizontalAlignment ou HorizontalContentAlignment à travers Listbox.ItemContainerStyle, et en utilisant exactement ce que vous avez mis ne donne aucune mise en forme du tout. Cela produit ce que cela ferait: listbox.Items.Ajouter ("ARTICLE 1" + "->" + "ARTICLE 2"); etc etc – baron

+0

J'ai mis à jour avec le ItemContainerStyle requis. Cela fonctionne dans mon environnement de test (notez que j'ai supposé que ITEM 2 devait être aligné correctement et que vous pourriez avoir besoin de le modifier si vous voulez un alignement différent). – itowlson

+0

Merci beaucoup, c'est une solution parfaite. J'ai une autre question, Comment pourrais-je ajouter un titre? c'est-à-dire avant que j'aie eu listbox.Add ("Prénom" + "Nom de famille"); mais maintenant je ne peux pas le faire avec Itemssource. Y a-t-il d'autres façons que d'ajouter un objet dans la collection qui agit comme titre? c'est-à-dire Firstname = "FIRST NAME" et Secondname = "SECOND NAME"? Peut-être que je viens de définir un label/textblock au-dessus de la liste – baron

0
<ListBox 
    x:Name="listBox" HorizontalContentAlignment="Right"/> 

le vérifier :)

+0

ça ne fait pas ce que je veux? mais peut-être que je n'ai pas expliqué correctement je vais faire un edit – baron