Перенесите управление Winforms на передний план

Есть ли любые другие методы выявления управления кроме управления. BringToFront ()? У меня есть серия маркировок на пользовательском элементе управления и когда я пытаюсь принести одному из них для противостояния на нее, не работает. Я даже циклично выполнился посредством всех средств управления и отправил им всю спину за исключением той, которой я интересуюсь, и это не изменяет вещь.

Вот метод, где маркировка добавляется к пользовательскому элементу управления

private void AddUserLabel()
{
    UserLabel field = new UserLabel();
    ++fieldNumber;

    field.Name = "field" + fieldNumber.ToString();         

    field.Top = field.FieldTop + fieldNumber;
    field.Left = field.FieldLeft + fieldNumber;
    field.Height = field.FieldHeight;
    field.Width = field.FieldWidth;
    field.RotationAngle = field.FieldRotation;
    field.Barcode = field.BarCoded;
    field.HumanReadable = field.HumanReadable;
    field.Text = field.FieldText;
    field.ForeColor = Color.Black;

    field.MouseDown += new MouseEventHandler(label_MouseDown);
    field.MouseUp += new MouseEventHandler(label_MouseUp);
    field.MouseMove += new MouseEventHandler(label_MouseMove);

    userContainer.Controls.Add(field);

    SendLabelsToBack(); //Send All labels to back

    userContainer.Controls[field.FieldName].BringToFront();
}

Вот метод, который отправляет всех их в спину.

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
    }
}
15
задан John Saunders 11 April 2010 в 19:50
поделиться

4 ответа

Да, есть еще один способ. Controls.SetChildIndex() также изменяет Z-порядок. Тот, у которого индекс 0, становится верхним. Однако это ничего не дает, BringToFront() использует этот метод.

Ваш метод SendLabelsToBack() в приведенном виде не может работать, он также отправит добавленную метку назад. Но ваше следующее утверждение снова исправляет это.

Хорошо, это не работает, что означает, что метод BringToFront() не выполняется. Посмотрите в окне Output на уведомление об "исключении первого шанса". Как написано, ваш SendLabelsToBack() вызовет исключение, если элемент управления пользователя содержит любой элемент управления, отличный от UserLabel. Также установите точку останова после вызова BringToFront() и проверьте значение userContainer.Controls[0].Name, когда он прервется.

20
ответ дан 1 December 2019 в 01:38
поделиться

Я думаю, вам просто нужно изменить вашу последнюю строку:

userContainer.Controls[field.FieldName].BringToFront(); 

на это:

userContainer.Controls[field.Name].BringToFront(); 

Когда вы используете строку в качестве индексатора для коллекции Controls, она использует свойство Name объекта элемент управления (а не свойство FieldName ).

Так как вы просто пытаетесь вывести наверх последний добавленный элемент управления, это также будет работать:

userContainer.Controls[userContainer.Controls.Count - 1].BringToFront();
3
ответ дан 1 December 2019 в 01:38
поделиться

Вы пробовали Invalidate () после BringToFront () ? BringToFront не вызывает событие Paint

попробуйте следующее:

private void SendLabelsToBack()
{
    foreach (UserLabel lbl in userContainer.Controls)
    {
        lbl.SendToBack();
        lbl.Invalidate();
    }
}
5
ответ дан 1 December 2019 в 01:38
поделиться

z-index элементов управления зависит от контейнера.

Если вы вызовете BringToFront для элемента управления, который находится внутри контейнера (например, Panel), он не выведет контейнер на передний план.
Поэтому элемент управления будет находиться только перед другими элементами управления в этом контейнере.

Чтобы увидеть, в каких контейнерах находятся элементы управления, можно воспользоваться панелью "Контур документа" в меню "Вид".

EDIT: Ваш элемент управления userContainer, вероятно, находится за другим элементом управления.

6
ответ дан 1 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: