۱۳۸۹ دی ۱۷, جمعه

ساخت Smart Tag های سفارشی برای کنترل های سفارش

 از سری مقالات قدیمی من :
برای بسیاری از برنامه نویسانی که همچون من علاقه زیادی به خلق وساخت کنترل های جدید دارند طراحی کنترل هایی با قابلیت های بالا و استفاده آسان یک مسئله پر اهمیت به حساب می آید.یکی از مسائلی که باید در طراحی کنترل های سفارشی مد نظر قرار داد  راحتی کار کردن با آن می باشد. برای رسیدن به این موضوع موارد مختلفی را از جمله انتخاب عناوین مناسب برای کلاس ها، پروپرتی ها و متد ها  و سایر عناصر موجود در کنترل، تعیین سطح دسترسی های معین برای هر قسمت از کنترل و ... باید مد نظر داشت.
یکی دیگر از مواردی که در User Friendly بودن کنترل های سقارشی می تواند بسیار موثر باشد قابلیت پشتیبانی در هنگام طراحی در موقع استفاده از کنترل می باشد. این همان مفهومی است که از آن به Design Time Support یاد می شود.
در نسخه 2005 ویژوال استودیو قابلیتی به کنترل ها اضافه شد که به آن Smart Tag می گویند. عملکرد Smart Tag که به صورت مثلثی کوچک در قسمت بالا و سمت راست کنترل ها ظاهر می گردد نمایش لیستی از خواص پرکاربر آن کنترل می باشد که به کاربر اجازه می دهد تا خواص پرکاربرد آن کنترل را سریع تر مقدار دهی کند تا بدین طریق به توسعه برنامه ها و طراحی فرم ها به نسبت قبل سرعت بخشیده شود.
در زیر نمونه هایی از Smart Tag را در کنترل های مختلف می توانید مشاهده کنید :
 

حال این سوال مطرح است که آیا می توان برای کنترل های سفارشی نیز به ایجاد Smart Tag اقدام کرد؟ جواب مثبت است  که در ادامه شیوه این کار را خواهید آموخت.
در ادامه یک کنترل جدید با عنوان GradientLable ایجاد خواهم کرد که امکان Smart tag  را نیز به آن اضافه کرده کرده ام. نمای نهایی کنترل در هنگام طراحی فرم و استفاده از آن به صورت زیر می باشد :


در ابتدا یک پروژه از نوع Class Library با نام GradientLable ایجاد کنید. Class1 را از آن حذف و یک کلاس به نام GradinetLable به ان اضافه کنید.(می توانید نام Class1 را به نام GradientLable تغییر دهید.)

 





 



کلاس GradinetLable از کلاس Control ارث بری کرده است. در این کلاس دو پروپرتی به نام های FirstColor و SecondColor برای ایجاد حالت گرادیان برای Lable مورد نظر ایجاد شده است. همچنین پروپرتی Textمربوط به کلاس Control نیز Override شده است تا بتوان آن را در پنجره Property Grid نمایش داد تا کاربر بتواند مقدار آن را تنظیم کند.

همانطور که در ابتدای تعریف کلاس مشخص شده است کلاس GradientLableControlDesigner به عنوان Designer کلاس GradinetLable تعریف شده است. توسط این کلاس می تواند شیوه Design کلاس مورد نظر را مشخص کرد.



تعریف کلاس GradientLableControlDesigner به صورت زیر می باشد :


در این کلاس خاصیت  ActionList جهت سفارشی کردن ان Override شده است. این خاصیت لیست ActionItem ها که در SmartTag مورد استفاده قرار خواهند گرفت را نگهداری می کند. این خاصیت بدان جهت Override شده است که بتوان خواصی را که مورد نیاز است به آن اضافه نمود. این خواص در کلاس GradientLableActionList که از کلاس DesignerActionList در فضای نام System.ComponentModel.Design قرار دارد تعریف شده اند.
تعریف کلاس GradinetLableActionList بصورت زیر می باشد :



در این کلاس خواص مورد نظر برای استفاده در SmartTag تعریف شده اند که توسط متد GetPropertyByName و دریافت PropertyDescriptor ومتد SetValue ، مقدار وارد شده توسط کاربر به خاصیت مرتبط باآن در کنترل اصلی (GradinetLable) که توسط پارامتر component به این کلاس  پاس داده شده است، نسبت داده می شود.

پس از تعریف خواص مورد نظر لازم است تا آن ها را توسط Override کردن متد GetSortedActionItems در لیست ActionItem های کنترل GradinetLable وارد کنیم تا آن ها در SmartTag ظاهر شوند.


در این مقاله فرض بر آن است که خواننده با مفاهیم برنامه نویسی سی شارپ، کلاس ها و استفاده از آن ها آشنایی لازم را دارد.
پ و :
هر گونه کپی برداری از مطالب این وبلاگ، به هر شکل و فرمتی منوط به دریافت مجوز از اینجانب می باشد./.