6
votes

Boucle sur les étiquettes définies xaml

J'ai une application WPF avec de nombreuses étiquettes.

for(int i = 1; i<40 ;i++)
{
    label"i".content = i*10;
}


5 commentaires

Pouvez-vous créer un tableau d'étiquettes, puis boucle?


J'ai créé mes étiquettes dans xaml comme: <étiquette x: nom = "label1" /> <étiquette x: nom = "label2" />


Code-derrière une option pour créer vos étiquettes?


WPF application ? Ou est-ce juste sur une fenêtre / contrôle?


Si vous devez définir chaque étiquette dans XAML, pourquoi ajouterait texte = 1 , texte = 10 etc. Soyez mauvais? Utiliser le code derrière, pour moi, serait plus obscope que de simplement la définir dans XAML.


6 Réponses :


1
votes

Vous pouvez ajouter toutes ces étiquette à une liste <étiquette> dans le constructeur du formulaire.

C'est un travail fastidieux, mais vous ne devez que Faites-le une fois. xxx


0 commentaires

3
votes

Si vous travaillez avec contraignant, il est facile. Il vous suffit de conserver votre contenu d'étiquettes dans un Observablecollection code> sur votre viewModel. Et puis, vous pouvez faire ce que vous voulez avec eux, dans votre cas itération.

Editer 1: P>

Votre XAML devrait également être quelque chose comme: p>

        <ItemsControl ItemsSource="{Binding MyLabelValues}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <sdk:Label Content="{Binding Mode=TwoWay}"></sdk:Label>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>


1 commentaires

Accepter. Cela devrait être la voie à suivre!



2
votes

Utilisation de ce code

foreach (Label lbl in FindVisualChildren<Label>(window))
{
    // do something with lbl here
}


0 commentaires

1
votes

Comment de cela? XXX PRE>

Le résultat final sera ceci. P>

label1.Text = 10;
label2.Text = 20;
label3.Text = 20;
...
...


0 commentaires

6
votes

Si vos étiquettes sont toutes nommées systématiquement, vous pouvez le faire comme ceci:

var numberOfLabels = 40;

for(int i = 1; i <= numberOfLabels; i++)
{
    var labelName = string.Format("label{0}", i);
    var label = (Label) this.FindName(labelName);
    label.Content = i * 10;
}


0 commentaires

0
votes

Vous pouvez le faire avec la liaison!

Vue XAML: P>

class ViewModelClass : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string name)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

        private ObservableCollection<StringObject> _List = new ObservableCollection<StringObject>();
        public ObservableCollection<StringObject> List
        {
            get { return _List; }
            set
            {
                _List = value;
                NotifyPropertyChanged("List");
            }
        }

        public ViewModelClass()
        {
            List = new ObservableCollection<StringObject>
                {
                    new StringObject {Value = "your"},
                    new StringObject {Value = "list"},
                    new StringObject {Value = "of"},
                    new StringObject {Value = "string"}
                };
        }
    }

    public class StringObject
    {
        public string Value { get; set; }
    }


0 commentaires