Есть ли способ настроить Z-порядок элементов управления на панели, чтобы он всегда был сверху при добавлении нового элемента управления? Я создаю карточную игру, и у меня есть панель с изображениями карт (новое окно с картинками для каждой карты). Когда добавляется новое изображение, оно автоматически переходит на заднюю часть панели. Есть ли способ, чтобы он всегда был на высоте? Я пробовал «SetChildIndex», но имя каждого графического окна будет таким же, как я повторно использую код. Любая помощь приветствуется. Спасибо

private void DealPlayerCard(int cardNum)
{
    string Card = Classes.Deck.GetCurrentCard();
    PictureBox pb = new PictureBox() { Width = 172, Height = 240, SizeMode = PictureBoxSizeMode.StretchImage };
    pb.ImageLocation = @"Cards\" + Card + ".png";
    int order = 0;

    switch (cardNum)
    {
        case 1:
            pb.Location = new Point(0, 0);
            order = 5;
            break;
        case 2:
            pb.Location = new Point(60, 0);
            order = 4;
            break;
        case 3:
            pb.Location = new Point(120, 0);
            order = 3;
            break;
        case 4:
            pb.Location = new Point(180, 0);
            order = 2;
            break;
        case 5:
            pb.Location = new Point(240, 0);
            order = 1;
            break;
    }

    AddPlayerCard(pb, order);
}

public void AddPlayerCard(PictureBox pb, int order)
{
    pnlPlayer.Controls.Add(pb);
    pnlPlayer.Controls.SetChildIndex(pb, order);
}

ИЗМЕНИТЬ

Используя идею Sinatr, я теперь использовал свойство элемента управления .Tag, чтобы присвоить номер z-порядка каждому из элементов управления, а затем всякий раз, когда я добавляю элемент управления, просто перебираю каждый элемент управления и устанавливаю свойство z-order = .Tag

private void DealPlayerCard(int cardNum)
{
    string Card = Classes.Deck.GetCurrentCardPicture();
    PictureBox pb = new PictureBox() { Width = 172, Height = 240, SizeMode = PictureBoxSizeMode.StretchImage };
    pb.ImageLocation = @"Cards\" + Card + ".png";

    switch (cardNum)
    {
        case 1:
            pb.Location = new Point(0, 0);
            pb.Tag = 5;
            break;
        case 2:
            pb.Location = new Point(60, 0);
            pb.Tag = 4;
            break;
        case 3:
            pb.Location = new Point(120, 0);
            pb.Tag = 3;
            break;
        case 4:
            pb.Location = new Point(180, 0);
            pb.Tag = 2;
            break;
        case 5:
            pb.Location = new Point(240, 0);
            pb.Tag = 1;
            break;
    }

    AddPlayerCard(pb);
    AddToHand("Player");
}

public void AddPlayerCard(PictureBox pb)
{
    pnlPlayer.Controls.Add(pb);
    foreach (Control Control in pnlPlayer.Controls)
    {
        pnlPlayer.Controls.SetChildIndex(Control, Int32.Parse(Control.Tag.ToString()));
    } 
}
1
Jack Allen 14 Янв 2019 в 19:01

2 ответа

Лучший ответ

Вы можете использовать метод BringToFront(), доступный для каждого элемента управления Winform:

controlName.BringToFront();

Это переводит элемент управления controlName на вершину z-порядка, заставляя его иметь z-порядок 0.

2
Jazimov 14 Янв 2019 в 23:10

Вы можете SetChildIndex(System.Windows.Forms.Control child, int newIndex), чтобы установить z-порядок.
Элемент управления с newIndex, установленным в 0, находится в верхней части z-порядка. Элементы управления с более высоким newIndex будут расположены ближе к низу.

1
Code Pope 14 Янв 2019 в 16:11