#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:
- вам нужно использовать другой макет, чтобы новые элементы располагались в обычном порядке. попробуйте StackPanel.
- вы можете использовать сетку и присваивать каждой новой строке метки = индекс.
- вы можете присвоить каждой новой метке поле, например newLabel.margin-top = index*50