
نوشته شده توسط
arastoahmadi
سلام به همه اساتید گرامی
دوستان من یه ImageButton با استفاده از UserControl در سی شارپ طراحی کرده ام که روی این دکمه یه PictureBox و دو تا لیبل موجود هست من رویداد کلیک این کنترل ها رو با رویداد کلیک UserControl م برابر کردم ، بعد الان من از این UserControl تو فرمم استفاده کرده ام و تو رویداد کلیک یه MessageBox نوشتم زمانی که رو خود UserControl کلیک می کنم پیغام رو نشون میده ولی وقتی رو آیکن و یا رو لیبل هاش کلیک میکنم پیغام رو نشون نمیده من میخام هرجا از UserControl رو کلیک کردم پیغام رو بهم نشون بده ممنون میشم راهنمایی بفرمایید
ترفند هایی هست، مثلا اگر شما یک کنترل (مثلا Label) رو با Enabled=false روی UserControl تون قرار بدهید، به اصطلاح Hit Test موفقیت آمیز نخواهد داشت و رخداد کلیک نمیگیره و در نتیجه UserControl زیر اون Label کلیک رو دریافت می کنه. پس اگر اون کنترل های روی UserControl تون Enabled شون false باشه، رخداد Click برای UserControl تون بدون مشکل ایجاد میشه.
در غیر اینصورت اگر بخواهید می توانید رخداد کلیک یا هر رخداد دیگری رو در UserControl تون بصورت دستی ایجاد کنید. هر رخدادی رو که خواستید فراخوانی کنید یک On قبلش اضافه کنید، میشه اسم یک متد که اون رخداد رو فراخوانی می کنه، مثلا اگر بخواهید رخداد Click در UserControl ایجاد بشه، متد OnClick اون UserControl رو فراخوانی کنید.
مثلا در UserControl تون کدی بنویسید که موقع کلیک کردن روی آیکون (که نمیدونم چه نوع کنترلی برایش بکار برده اید) و روی Label ها و ... رخداد های کلاس UserControl رو Invoke کنه :
private void label1_Click(object sender, EventArgs e)
{
OnClick(e);
}
private void pictureBox1_Click(object sender, EventArgs e)
{
OnClick(e);
}
شاید لازمتون نباشه اما اگر بخواهید بجز Click رخداد های دیگری مثل MouseMove رو با دقت بکار ببرید، باید در نظر بگیرید که Label موقعیت ماوس رو نسبت به خودش میسنجه، نه UserControl. پس درستش اینه که موقعیت نسبی ماوس رو که نسبت به Label سنجیده شده به نسبت UserControl تبدیل کنید تا توسط UserControl موقعیت ماوس اشتباهی اعلام نشه :
private void label1_MouseMove(object sender, MouseEventArgs e)
{
var pos = PointToClient(label1.PointToScreen(e.Location));
OnMouseMove(new MouseEventArgs(e.Button, e.Clicks, pos.X, pos.Y, e.Delta));
}