Я хочу добавить кнопки в свое окно WPF при нажатии кнопки. Мне нужен квадрат из кнопок 8x8, который размещается в верхнем левом углу. Я пробовал этот код:

int left = 20, top = 20;
        for (int x = 0; x < 8; x++)
        {
            for (int y = 0; y < 8; y++)
            {
                fields[x, y] = new Button();
                fields[x, y].Margin = new Thickness(left, top, 0, 0);
                left += 70;
                fields[x, y].Height = 32;
                fields[x, y].Width = 32;
                fields[x, y].Click += new RoutedEventHandler(field_Click);

                fields[x, y].Name = "Field_" + x + "_" + y;
                this.AddChild(fields[x, y]);


            }
            left = 20;
            top += 70;
        }

Но это дает мне ошибку: я не могу добавить несколько элементов управления в ContentControl; В чем тут ошибка?

0
Ian H. 24 Фев 2016 в 23:02

2 ответа

Лучший ответ

Элемент управления содержимым - это StackPanel, Grid, Canvas и т. Д. Вам необходимо разместить все элементы управления внутри элемента управления содержимым, поскольку Window или UserControl могут иметь только один дочерний элемент управления.

Xaml :

<StackPanel>
   <Button/>
   <Button/>
</StackPanel>

В вашем случае код С # должен выглядеть примерно так:

StackPanel yourSP = new StackPanel(); // Creates a new content control.
Button button1 = new Button;          // Creates buttons.
Button button2 = new Button;
this.AddChild(yourSP);                // Adds StackPanel to your Window/UserControl
yourSP.Children.Add(button1);         // Adds buttons to content control.
yourSP.Children.Add(button2);

Он создает новый StackPanel, который является элементом управления содержимым, и добавляет его в качестве дочернего элемента к вашему Window/UserControl, после чего вы добавляете Buttons в свой StackPanel.

См. здесь для получения дополнительной информации об элементах управления содержанием.

2
Karolis Kajenas 24 Фев 2016 в 20:31

На мой взгляд, самый простой способ добиться того, чего вы хотите, - это использовать UniformGrid. Приведенный ниже код не тестировался, но должен выглядеть примерно так:

const int squareSize = 8;
var grid = new UniformGrid { Rows = squareSize, Columns = squareSize };
for (int y = 0; y < squareSize; y++)
{
    for (int x = 0; x < squareSize; x++)
    { 
        var btn = new Button { Height = 32, Width = 32 };
        btn.Click += field_Click;
        grid.Children.Add(btn);
        fields[x, y] = btn;
    }
}
this.AddChild(grid);
1
robertos 24 Фев 2016 в 21:13