Есть ли любые другие методы выявления управления кроме управления. 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();
}
}
Да, есть еще один способ. Controls.SetChildIndex()
также изменяет Z-порядок. Тот, у которого индекс 0, становится верхним. Однако это ничего не дает, BringToFront()
использует этот метод.
Ваш метод SendLabelsToBack()
в приведенном виде не может работать, он также отправит добавленную метку назад. Но ваше следующее утверждение снова исправляет это.
Хорошо, это не работает, что означает, что метод BringToFront()
не выполняется. Посмотрите в окне Output на уведомление об "исключении первого шанса". Как написано, ваш SendLabelsToBack()
вызовет исключение, если элемент управления пользователя содержит любой элемент управления, отличный от UserLabel. Также установите точку останова после вызова BringToFront()
и проверьте значение userContainer.Controls[0].Name
, когда он прервется.
Я думаю, вам просто нужно изменить вашу последнюю строку:
userContainer.Controls[field.FieldName].BringToFront();
на это:
userContainer.Controls[field.Name].BringToFront();
Когда вы используете строку в качестве индексатора для коллекции Controls, она использует свойство Name
объекта элемент управления (а не свойство FieldName
).
Так как вы просто пытаетесь вывести наверх последний добавленный элемент управления, это также будет работать:
userContainer.Controls[userContainer.Controls.Count - 1].BringToFront();
Вы пробовали Invalidate ()
после BringToFront ()
? BringToFront не вызывает событие Paint
попробуйте следующее:
private void SendLabelsToBack()
{
foreach (UserLabel lbl in userContainer.Controls)
{
lbl.SendToBack();
lbl.Invalidate();
}
}
z-index элементов управления зависит от контейнера.
Если вы вызовете BringToFront для элемента управления, который находится внутри контейнера (например, Panel
), он не выведет контейнер на передний план.
Поэтому элемент управления будет находиться только перед другими элементами управления в этом контейнере.
Чтобы увидеть, в каких контейнерах находятся элементы управления, можно воспользоваться панелью "Контур документа" в меню "Вид".
EDIT: Ваш элемент управления userContainer
, вероятно, находится за другим элементом управления.