Я делаю приложение в winforms, которое показывает схему в графическом блоке, и мне нужно программно разместить на нем части. Эти части должны быть интерактивными (таким образом, они должны быть пользовательскими элементами управления), а затем запускать соответствующее событие щелчка (щелчок по части должен отображать информацию, уникальную для этой части). Я мог бы сказать, что хочу разместить пользовательские кнопки на своей картинке. Теперь, конечно, мне нужно только одно событие щелчка и изменять отображаемую информацию в соответствии с выбором, хотя я не знаю, как «связать» это событие с каждой созданной кнопкой.
У меня есть список частей рядом с графическим блоком, и выбор части должен привести к тому, что связанный элемент управления появится в форме (а снятие выделения с него должно удалить его или, по крайней мере, сделать его скрытым). Сначала я подумал, что создам один элемент управления во время проектирования, заставлю его появляться / исчезать и перемещать его при каждом выборе. Проблема в том, что пользователь должен иметь возможность выбирать несколько частей, а программа должна отображать все выбранные части на чертеже.
Поскольку все чертежи индивидуальны, количество деталей не может быть определено заранее. Возможно ли создание нескольких экземпляров одного и того же элемента управления на ходу? Или есть обходной путь?
1 ответ
Если вы используете элементы управления для своих элементов изображения (вы ничего не определяете по координатам щелчка мыши) и каждый элемент изображения связан только с одним элементом управления меню, то я могу предложить вам использовать Tag, чтобы связать соответствующие элементы управления меню:
public Form1()
{
InitializeComponent();
this.CreatePictureRelatedControls();
}
private void CreatePictureRelatedControls()
{
Int32 xPictureControls = 50,
yPictureControls = 50,
xAssociatedControls = 200,
yAssociatedControls = 50,
yMargin = 10;
Int32 controlWidth = 125,
controlHeight = 20;
Int32 controlCount = 3;
// ---------Associated controls-----------------
var associatedControls = new Button[controlCount];
// Loop - creating associated controls
for (int i = 0; i < associatedControls.Length; i++)
{
var associatedButton = new Button()
{
Left = xAssociatedControls,
Top = yAssociatedControls + (i * (controlWidth + yMargin)),
Width = controlWidth,
Height = controlHeight,
Text = String.Format("associated control {0}", i),
Visible = false
};
// Event handler for associated button
associatedButton.Click += (sender, eventArgs) =>
{
MessageBox.Show(((Control)sender).Text, "Associated control clicked");
};
associatedControls[i] = associatedButton;
}
// ----------------- Picture controls ---------------
var pictureControls = new Button[controlCount];
// Loop - creating picture controls
for (int i = 0; i < pictureControls.Length; i++)
{
var pictureButton = new Button()
{
Left = xPictureControls,
Top = yPictureControls + (i * (controlWidth + yMargin)),
Width = controlWidth,
Height = controlHeight,
Text = String.Format("picture part button {0}", i),
// Use of tag property to associate the controls
Tag = associatedControls[i],
Visible = true
};
// Event hadler for picture button
pictureButton.Click += (sender, eventArgs) =>
{
Control senderControl = (Control)sender;
Control associatedControl = (Control)senderControl.Tag;
associatedControl.Visible = !associatedControl.Visible;
};
pictureControls[i] = pictureButton;
}
this.Controls.AddRange(associatedControls);
this.Controls.AddRange(pictureControls);
}
P.S. Если вам нужно связать несколько элементов управления, вы можете просто установить свойство Tag для некоторой коллекции:
button.Tag = new Control[] {associated[1], associated[3]};
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
click
с кнопкой, вы можете просто дважды щелкнуть по ней ( не во время выполнения), и ваш фокус переместится на его событиеclick
.