کنترل کننده رویداد (event Handler)

WPF از مکانیزم کنترل کننده رویداد برای کنترل رویدادها که در هنگام اجرای برنامه به وقوع می‌پیوندند استفاده می‌کند. رویدادها رفتارهایی یا اتفاقاتی هستند که هنگام اجرای برنامه به وقوع می‌پیوندند. کنترل رویداد فرایند نظارت بر وقوع یک رویداد مشخص می‌باشد. فرم‌های ویندوزی از کنترل کننده رویداد برای اضافه کردن یک قابلیت و پاسخ به کاربر استفاده می‌کنند. بدون کنترل کننده رویداد، فرم‌ها و رابط گرافیکی تا حد زیادی بدون استفاده هستند.

رویدادها در WPF مشابه همان رویدادها در ویندوز فرم هستند. همه کنترل‌ها تعدادی رویداد دارند که می‌توانید از آن‌ها برای اهداف مختلف استفاده کنید. هر زمان که یک رویداد اتفاق می افتد، برنامه از آن آگاه می‌شود و می‌تواند نسبت به آن واکنش نشان دهد. برای مثال زمانی که بر روی دکمه ضربدر پنجره کلیک می‌کنید، پنجره بسته می‌شود.

انواع مختلفی از رویدادها وجود دارد که با استفاده از آن‌ها می‌توانید رفتار برنامه را در شرایط مختلف کنترل کنید، اما رایج‌ترین رویدادهایی که معمولاً مورد استفاده قرار می‌گیرند، رویدادهای مربوط به ماوس و کیبورد هستند که عبارتند از:

نام رویداد توضیحات
Click زمانی که بر روی یک کنترل کلیک شود این رویداد اتفاق می افتد.
MouseDown زمانی که دکمه ماوس فشرده شود این رویداد اتفاق می افتد.
MouseEnter زمانی که کرسر ماوس بر روی کنترل قرار گیرد این رویداد اتفاق می افتد.
MouseLeave زمانی که کرسر ماوس از روی کنترل خارج شود این رویداد اتفاق می افتد.
MouseUp زمانی که دکمه ماوس رها شود این رویداد اتفاق می افتد.
KeyDown زمانی که یکی از کلیدهای کبیبورد فشرده شود این رویداد اتفاق می افتد.
KeyUp زمانی که یکی از کلیدهای کیبورد رها شود این رویداد اتفاق می افتد.

اکنون می‌خواهیم در قالب یک مثال ساده، رویداد Click یک دکمه را مورد بررسی قرار دهیم. به کد XAML زیر توجه کنید:

<Grid>
   <Button x:Name="button1" Content="Click" Click="button1_Click" Width="150" Height="30" HorizontalAlignment="Center" />
</Grid>

زمانی که این برنامه را اجرا کنید خروجی زیر را نمایش می‌دهد:

برای اینکه یک رویداد Click را برای این دکمه تعریف کنیم خصیصه Click را به صورت زیر به آن اضافه می‌کنیم:

Click="button1_Click"

در این مثال، زمانی که بر روی دکمه کلیک شود، متدی به نام button1_Click در کدهای سی شارپ فراخوانی می‌شود. حال سوالی که در اینجا پیش می‌آید این است که چگونه این متد را ایجاد کنیم؟
خوشبخانه ویژوال استودیو با استفاده از ویژگی IntelliSense به شما کمک می‌کند تا به سادگی این کار را انجام دهید. برای این منظور کافی است ابتدا نام رویداد مورد نظر خود را که در این مثال Click است بنویسید. حال زمانی علامت = را جلوی نام این رویداد تایپ کنید، ویژوال استودیو یک منو مانند تصویر زیر را برای شما نمایش می‌دهد:

زمانی که <New Event Handler> را انتخاب کنید، ویژوال استودیو متد مربوط به این رویداد را به صورت خودکار ایجاد می‌کند. ساختار کلی نامی که برای این متد در نظر می‌گیرد به صورت زیر است:

<control name>_<event name>

از آنجایی که نام کنترل ما در این مثال button1 است و همچنین نام رویدادی که می‌خواهیم برای این کنترل ایجاد کنیم Click است، بنابراین نام این متد را button1_Click در نظر می‌گیرد. اکنون زمانی که به کدهای سی شارپ برنامه خود نگاه کنید، مشاهده می‌کنید که یک متد به نام button1_Click به صورت زیر اضافه شده است:

حال می‌توانید کد مورد نظر خود را داخل این متد بنویسید. برای مثال ما می‌خواهیم زمانی که بر روی این دکمه کلیک شد، یک پیغام را نمایش دهد که کد آن به صورت زیر است:

private void Button1_Click(object sender, RoutedEventArgs e)
{
   MessageBox.Show("Button is clicked!");
}

در بیشتر برنامه‌ها، با روشی که بالاتر توضیح داده شد می‌توانید یک رویداد را برای کنترل مورد نظر خود ایجاد کنید. اما گاهی از اوقات نیاز داریم تا یک رویداد را از طریق کدهای سی شارپ ایجاد کنیم. به مثال زیر توجه کنید:

<Grid>
   <Button x:Name="button1" Content="Click" Width="150" Height="30" HorizontalAlignment="Center" />
</Grid>

در کد بالا، ما همان دکمه مثال قبل را ایجاد کرده‌ایم، ولی بدون خاصیت Click. حال به فایل MainWindows.xaml.cs رفته و کدهای زیر را می‌نویسیم:

زمانی که این برنامه را اجرا کنیم خروجی زیر را نمایش می‌دهد:

برای اینکه یک رویداد را با استفاده از کدهای سی شارپ ایجاد کنیم ابتدا نام کنترل و رویداد مورد نظرمان را که در اینجا button1.Click می‌نویسیم سپس زمانی که مقابل آن =+ را تایپ کنیم، ویژوال استودیو یک پیغام را به صورت زیر نمایش می‌دهد:

در اینجا ویژوال استودیو می‌گوید که اگر بر روی دکمه TAB کلیک کنید، به صورت خودکار رویداد Click این دکمه را ایجاد می‌کند. زمانی که بر روی TAB کلیک کنید یک متد به صورت زیر به کدهای سی شارپ برنامه شما اضافه می‌شود:

در اینجا شما می‌توانید کد throw new System.NotImplementedException را که به صورت پیش فرض داخل این متد نوشته شده است حذف کنید. اگر این کار را انجام ندهیم، زمانی که بر روی دکمه کلیک شود یک خطا از نوع NotImplementedException ایجاد می‌شود و به شما یادآوری می‌کند که هنوز داخل بدنه این متد کدی ننوشته‌اید.
روش آخر بری ایجاد یک کنترل کننده رویداد این است که همه کارها را به عهده ویژوال استودیو بسپاریم. بدین صورت که ابتدا یک دکمه را از جعبه ابزار گفته و بر روی فرم قرار می دهیم:

بعد از تنظیم مکان و اندازه کنترل، در پنجره Properties به قسمت رویدادها رفته (1) سپس یک نام برای دکمه انتخاب می کنیم (2)، که در اینجا ما اسم آن را button1 گذاشته ایم و در نهایت بر روی رویداد Click دوبار کلیک کرده (3) تا همه کارها به صورت خودکار توسط ویژوال استودیو انجام شود.