динамически создаваемые метки перекрывают друг друга

#c# #wpf #label

#c# #wpf #метка

Вопрос:

Я хочу создавать метки, которые будут следовать друг за другом. У меня есть имя сетки WordTemplateLayout , к которому я хочу добавить метки. Я добавляю их динамически в оконный конструктор wpf после InitializeComponent() вызова. Вот метод создания меток:

 private void CreateWordTemplate()
        {
            IList<char> template = CurrentGame.Template;
            double widthPerBox = WordTemplateLayout.Width / template.Count;
            //template.Count being a number, irrelevant to the question 
            for (int i = 0; i < template.Count; i  )
            {
                var templateVisual = new Label();
                templateVisual.Name = "c"    i;
                templateVisual.Width = widthPerBox;
                templateVisual.Height = WordTemplateLayout.Height;
                templateVisual.Background = new SolidColorBrush(Colors.Aqua);
                WordTemplateLayout.Children.Add(templateVisual);
            }
        }
  

проблема в том, что на самом деле добавляется то, что вместо того, чтобы метки выстраиваются одна за другой, они перекрывают друг друга:
В aqua box все метки перекрывают друг друга

итак, я спрашиваю, как я могу заставить метки выстраиваться (по горизонтали), а не перекрываться?

Комментарии:

1. Я, конечно, не WPF wiz, но разве вы не должны добавлять их в StackPanel или что-то в этом роде?

2. Вы можете создать их из itemscontrol, связав observablecollection элементов viewmodels, содержащих данные для того, что они представляют. Добавление их в код — плохой план. Чего вы пытаетесь достичь здесь?

Ответ №1:

Как указывали другие, вам лучше использовать StackPanel или научиться использовать viewmodels и привязку данных. Сказав это, чтобы ответить на ваш прямой вопрос, вот как вы могли бы сделать это программно.

** ПРИМЕЧАНИЕ: игнорируйте 5 то, что я передаю в методы, и вместо этого используйте ваши template.Count . Это было просто для меня, чтобы заставить его работать с моей стороны.

         public MainWindow()
        {
            InitializeComponent();
            CreateGridLayout(5);
            CreateWordTemplate(5);
        }

        // Define the Grid layout
        // If you want the labels to follow one another horizontally, define columns.  
        // If you want them stacked vertically, instead define rows.
        private void CreateGridLayout(int count)
        {
            for (int i = 0; i < count; i  )
            {
                WordTemplateLayout.ColumnDefinitions.Add(new ColumnDefinition());
            }
        }

        private void CreateWordTemplate(int count)
        {
            double widthPerBox = WordTemplateLayout.Width / 5;
            for (int i = 0; i < 5; i  )
            {
                var templateVisual = new Label();
                templateVisual.SetValue(Grid.ColumnProperty, i); // SET YOUR COLUMN HERE!
                templateVisual.Name = "c"   i;
                templateVisual.Width = widthPerBox;
                templateVisual.Height = WordTemplateLayout.Height;
                templateVisual.Background = new SolidColorBrush(Colors.Aqua);
                templateVisual.Content = templateVisual.Name;                
                WordTemplateLayout.Children.Add(templateVisual);
            }
        }
  

Ответ №2:

  1. вам нужно использовать другой макет, чтобы новые элементы располагались в обычном порядке. попробуйте StackPanel.
  2. вы можете использовать сетку и присваивать каждой новой строке метки = индекс.
  3. вы можете присвоить каждой новой метке поле, например newLabel.margin-top = index*50