PDA

View Full Version : راهنمایی در موردUserControl در سی شارپ



arastoahmadi
یک شنبه 07 اردیبهشت 1399, 08:27 صبح
سلام به همه اساتید گرامی

دوستان من یه ImageButton با استفاده از UserControl در سی شارپ طراحی کرده ام که روی این دکمه یه PictureBox و دو تا لیبل موجود هست من رویداد کلیک این کنترل ها رو با رویداد کلیک UserControl م برابر کردم ، بعد الان من از این UserControl تو فرمم استفاده کرده ام و تو رویداد کلیک یه MessageBox نوشتم زمانی که رو خود UserControl کلیک می کنم پیغام رو نشون میده ولی وقتی رو آیکن و یا رو لیبل هاش کلیک میکنم پیغام رو نشون نمیده من میخام هرجا از UserControl رو کلیک کردم پیغام رو بهم نشون بده ممنون میشم راهنمایی بفرمایید

151649

the king
یک شنبه 07 اردیبهشت 1399, 14:41 عصر
سلام به همه اساتید گرامی

دوستان من یه ImageButton با استفاده از UserControl در سی شارپ طراحی کرده ام که روی این دکمه یه PictureBox و دو تا لیبل موجود هست من رویداد کلیک این کنترل ها رو با رویداد کلیک UserControl م برابر کردم ، بعد الان من از این UserControl تو فرمم استفاده کرده ام و تو رویداد کلیک یه MessageBox نوشتم زمانی که رو خود UserControl کلیک می کنم پیغام رو نشون میده ولی وقتی رو آیکن و یا رو لیبل هاش کلیک میکنم پیغام رو نشون نمیده من میخام هرجا از UserControl رو کلیک کردم پیغام رو بهم نشون بده ممنون میشم راهنمایی بفرمایید

151649


ترفند هایی هست، مثلا اگر شما یک کنترل (مثلا 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));
}

mmbguide
یک شنبه 07 اردیبهشت 1399, 21:34 عصر
سلام

یه راه دیکه هم اینه که Event تعریف کنید. البته هر چندتا که لازم دارید. و این کار کمک میکنه که EndUser میتونه مثل سایر رویدادهای یک کنترل بره و برای اون رویداد کد دلخواه خودش رو بنویسه. مثلا شما میتونید یک Event تعریف کنید با نام ClickOnIcon و کاربر هم در زمان کار با اون کنترل در بین تمام رویدادهای کنترل یک رویداد با نام ClickOnIcon خواهد داست که میتونه برای خودش کدهای مورد نیازشو بنویسه.

arastoahmadi
دوشنبه 08 اردیبهشت 1399, 07:52 صبح
با سلام و احترام

دوستان بسیار سپاسگذارم از پاسختون خیلی کمک کردین واقعا عالی بود