Представьте, что у меня есть 10 кнопок, и я хочу использовать событие ввода мыши, чтобы увеличить ширину и высоту кнопок на 30. Если я захочу сделать это, я должен использовать событие мыши для каждого из них один за другим, как я могу писать только мой код один раз для всех кнопок. Я пытаюсь использовать цикл foreach, но не уверен, что я должен использовать загрузку формы и не знаю, как обрабатывать событие. (форма окон)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace main
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control item in Controls)
{
if (item is Button)
{
// code
}
}
}
}
}
Прежде всего, сократите свой код, получив только кнопки в форме. Затем добавьте обработчик событий для события MouseEnter
:
foreach (Button btn in Controls.OfType<Button>())
{
btn.MouseEnter += new System.EventHandler(btn_MouseEnter);
}
Затем в случае изменения ширины:
private void btn_MouseEnter(object sender, System.EventArgs e)
{
var senderButton = (Button)sender;
senderButton.Width += 30;
}
Вы также должны добавить событие обработчика событий + событие для MouseLeave
чтобы снова уменьшить ширину. В противном случае кнопки будут продолжать расти:
foreach (Button btn in Controls.OfType<Button>())
{
btn.MouseEnter += new System.EventHandler(btn_MouseEnter);
btn.MouseLeave += new System.EventHandler(btn_MouseLeave );
}
private void btn_MouseEnter(object sender, System.EventArgs e)
{
var senderButton = (Button)sender;
senderButton.Width += 30;
}
private void btn_MouseLeave (object sender, System.EventArgs e)
{
var senderButton = (Button)sender;
senderButton.Width -= 30;
}
Код foreach-loop можно добавить после InitializeComponent()
или в событие Form_Load
.
private void Form1_Load(object sender, System.EventArgs e)
{
foreach (Button btn in Controls.OfType<Button>())
{
btn.MouseEnter += new System.EventHandler(btn_MouseEnter);
btn.MouseLeave += new System.EventHandler(btn_MouseLeave );
}
}
Используйте функции, чтобы обернуть свою логику.
Напишите свой код, который изменит вес и ширину в методе, подпишитесь на MouseMove или на любое другое событие, которое вам подходит.
Затем используйте GetChildAtPoint, чтобы найти кнопку, чтобы вы могли изменить ее размер.
// This goes in the
foreach(var button in this.Controls.OfType<Button>())
{
button.Mouse += button_IncreaseSize;
}
protected override void button_IncreaseSize(MouseEventArgs e)
{
// use GetChildAtPoint to get the control
var button = GetChildAsPoint(new Point(e.X, e.Y));
// Change the size of button, eg. with Scal, and with the Size property, or by chaning Height and Width propertis manually
button.Scale(new SizeF(30, 30));
}
В качестве альтернативы вы также можете это сделать:
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control item in this.Controls)
{
if (item is Button)
{
//item.MouseEnter += (s, ea) => { YourMethodName(); };
item.MouseEnter += new System.EventHandler(btn_MouseEnter);
}
}
}
private void btn_MouseEnter(object sender, System.EventArgs e)
{
//your code to increase width and height
var btnSenderButton = sender as Button;
btnSenderButton.Width += 30;
}
Form1
здесь. Почему это используется?
load