locked
"Mélange" d'item dans les ListBox RRS feed

  • Question

  • Bonjour,

    Je rencontre un problème assez gênant sur l'ensemble des ListBox de mon application, dès que j'ai  une liste qui dépasse la taille de l'écran, il suffit que je fasse quelques défilements pour que les différents éléments ne soient plus à leurs place d'origine. 

    Exemple :

    Au départ j'ai une liste de ce type :

    • Item 1 
    • Item 2 
    • Item 3
    • ...
    • Item 50

    Après quelques défilements :

    • Item 38
    • Item 3
    • Item 13
    • ... etc.

    J'utilise un UserControl pour remplir la liste, ne pouvant pas faire de binding (liste récupérée en json, et devant être affichée différemment suivant certains cas) les éléments sont renseignés dans le code behind du UserControl. 

    Quelqu'un aurait une idée pour corriger ce problème ?


    • Modifié skamlet vendredi 5 octobre 2012 09:21
    vendredi 5 octobre 2012 09:21

Réponses

  • Supprime la virtualisation ca se passera mieux :

    <ListBox>
     <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel/>
        </ItemsPanelTemplate>
      </ListBox.ItemsPanel>
    
    


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    • Marqué comme réponse skamlet lundi 8 octobre 2012 06:39
    dimanche 7 octobre 2012 20:43

Toutes les réponses

  • Bonjour,

    Il n'y a aucune raison technique que les items de ta ListBox soient mélangés au scroll : le code de chargement et la partie du XAML concernant cette question nous serait utile pour t'aider :)


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    vendredi 5 octobre 2012 10:04
  • Voici ma ListBox :

    <!--ContentPanel - place additional content here-->
    
    <ListBox x:Name="ListBox" ItemsSource="{Binding Fields}" Grid.Row="1">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <template:FormFieldControl Width="480" Margin="0,0,0,20"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    Mon UserControl :

    <Grid x:Name="LayoutRoot">
    	<Grid.RowDefinitions>
    		<RowDefinition Height="Auto"/>
    		<RowDefinition Height="Auto"/>
    	</Grid.RowDefinitions>
    </Grid>

    Et le code behind de mon UserControl :

    public partial class FormFieldControl : UserControl
    	{
    		private ECFormField Field { get; set; }
    		private bool IsFieldCreated { get; set; }
    
    		public FormFieldControl()
    		{
    			InitializeComponent();
    			this.Loaded += new RoutedEventHandler(FormFieldControl_Loaded);
    		}
    
    		void FormFieldControl_Loaded(object sender, RoutedEventArgs e)
    		{
    			Field = (ECFormField)DataContext;
    			Debug.WriteLine("FormFieldControl Loaded : " + Field.Label + " IsFieldCreated = " + IsFieldCreated);
    
    			if (!IsFieldCreated)
    			{
    				CreateField();
    			}
    		}
    
    		private void CreateField()
    		{
    			IsFieldCreated = true;
    
    			TextBlock label = new TextBlock();
    			label.Text = Field.Label;
    			label.SetValue(Grid.RowProperty, 0);
    			LayoutRoot.Children.Add(label);
    
    			switch (Field.Type)
    			{
    				case ECFormType.Singlefield:
    					TextBox textBox = new TextBox();
    					//textBox.Watermark = Field.Hint;
    
    					textBox.SetValue(Grid.RowProperty, 1);
    					LayoutRoot.Children.Add(textBox);
    					break;
    				case ECFormType.Multiline:
    					TextBox multilineTextBox = new TextBox();
    					multilineTextBox.AcceptsReturn = true;
    					multilineTextBox.Height = 160;
    					multilineTextBox.TextWrapping = TextWrapping.Wrap;
    
    					multilineTextBox.SetValue(Grid.RowProperty, 1);
    					LayoutRoot.Children.Add(multilineTextBox);
    					break;
    				case ECFormType.ToggleButton:
    					ToggleSwitch toggleSwitch = new ToggleSwitch();
    
    					toggleSwitch.SetValue(Grid.RowProperty, 1);
    					LayoutRoot.Children.Add(toggleSwitch);
    					break;
    				case ECFormType.CheckboxGroup:
    					List<CheckBox> checkBoxes = new List<CheckBox>();
    					CheckBox checkBox;
    
    					StackPanel checkboxPanel = new StackPanel();
    					checkboxPanel.Orientation = Orientation.Vertical;
    
    					checkboxPanel.SetValue(Grid.RowProperty, 1);
    					LayoutRoot.Children.Add(checkboxPanel);
    
    					foreach (string value in Field.Values)
    					{
    						checkBox = new CheckBox();
    						checkBox.Content = value;
    
    						checkBoxes.Add(checkBox);
    						checkboxPanel.Children.Add(checkBox);
    					}
    
    					break;
    				case ECFormType.DropdownList:
    					ListPicker listPicker = new ListPicker();
    					ListPickerItem item;
    
    					listPicker.SetValue(Grid.RowProperty, 1);
    					LayoutRoot.Children.Add(listPicker);
    
    					foreach (string value in Field.Values)
    					{
    						item = new ListPickerItem();
    						item.Content = value;
    						listPicker.Items.Add(item);
    					}
    
    					break;
    				case ECFormType.DatePicker:
    					DatePicker datePicker = new DatePicker();
    
    					datePicker.SetValue(Grid.RowProperty, 1);
    					LayoutRoot.Children.Add(datePicker);
    
    					break;
    				case ECFormType.DateTimePicker:
    					break;
    				default:
    					break;
    			}
    		}
    	}

    vendredi 5 octobre 2012 11:24
  • Supprime la virtualisation ca se passera mieux :

    <ListBox>
     <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel/>
        </ItemsPanelTemplate>
      </ListBox.ItemsPanel>
    
    


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue

    • Marqué comme réponse skamlet lundi 8 octobre 2012 06:39
    dimanche 7 octobre 2012 20:43
  • Merci beaucoup, ça corrige bien le problème. Par contre qu'entends tu par virtualisation, je ne comprend pas trop ce que cela change ?
    lundi 8 octobre 2012 06:41