( تعداد نمایش : 605 )

ایجاد یک کنترل – قسمت دوم

ایجاد یک ویرایشگر برای تعیین مقدار خصوصیت در محیط طراحی

بمنظور ایجاد یک ویرایشگر برای یک خصوصیت شما ابتدا باید فرم مورد نظر را طراحی کنید. البته لازم به ذکر می باشد که حتما لازم نیست فرم جدیدی طراحی کنید و می توانید از فرم ها و مدلهای موجود استفاده کنید. در اینجا فرض کنید که یک فرم در شاخه Design کنترل مورد نظر ایجاد کرده اید. پس از طراحی و ایجاد فرم مورد نظر باید یک کلاس ارث برده شده از UITypeEditor ایجاد کرده و فرم مورد نظر را فراخوانی نمایید. در این کلاس باید حداقل دو متد EditValue و GetEditStyle را بازنویسی مجدد نمایید. متد EditValue زمانیکه کاربر برروی دکمه کنار خصوصیت کلیک کند فراخوانی می گردد. در این متد می توانید فرم ایجاد شده را فراخوانی کنید. متد دوم به منظور تعیین حالت نمایش فرم ایجاد شده بکار می رود.

public class StringEditor : System.Drawing.Design.UITypeEditor
{
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider serviceProvider, object value)
{
if ((context != null) && (serviceProvider != null))
{
//Set the editor service
IWindowsFormsEditorService edSvc =
(IWindowsFormsEditorService)serviceProvider.GetService(
typeof(IWindowsFormsEditorService));

if (edSvc != null)
{
//Create new designed form
DesignedForm form = new DesignedForm();
form.Value = (string)value;
//Show form as a dialog
DialogResult result = edSvc.ShowDialog(form);
if (result == DialogResult.OK)
{
value = form.Value;
}
}
}
return value;
}

public override UITypeEditorEditStyle GetEditStyle( ITypeDescriptorContext context)
{
if (context != null) {
//The editor will be a modal window.
return UITypeEditorEditStyle.Modal;
}
return base.GetEditStyle(context);
}
}

پس از انجام تعاریف فوق باید صفت Editor خصوصیت را همانطور که در قسمت قبلی ذکر شد مقدار دهی نمایید.

[Editor(typeof(StringEditor),
typeof(UITypeEditor))]
public string ServerUrl
{

در صورتیکه نوع خصوصیت شما از نوع enum باشد در محیط طراحی بصورت خودکار لیستی از مقادیر قابل انتخاب تعریف شده در enum در اختیار کاربر قرار می گیرد. در صورتیکه خواسته باشید خود مقادیر لیست را مشخص کرده و یا نوع خصوصیت از enum نبوده ولی نیازمند لیستی از مقادیر در زمان طراحی باشید می توانید کلاسی از ListboxTypeEditor ارث بری کرده و با بازنویسی متد FillInList آن مقادیر مورد نظر خود را در لیست درج نمایید. طریقه استفاده آن در خصوصیت همانند مورد فوق می باشد.

public class FormatListboxTypeEditor : ListboxTypeEditor
{
protected override void FillInList(ITypeDescriptorContext context,
IServiceProvider provider, ListBox listBox)
{
listBox.Items.Add(“Item 1″);
listBox.Items.Add(“Item 2″);
listBox.Items.Add(“Item 3″);
listBox.BorderStyle = BorderStyle.None;
}
}

افزودن امکان پشتیبانی توسط جعبه ابزار (ToolBox)

افزودن امکان پشتیبانی توسط جعبه ابزار برای یک کنترل بسیار آسان می باشد. بدین منظور نیازمند یک تصویر برای نمایش در جعبه ابزار و چندین تنظیم کوچک برروی کلاس می باشیم.

تصویر مورد استفاده برای کنترل از نوع Bitmap بوده و باید ۱۶ رنگ بوده و اندازه آن ۱۶*۱۶ باشد. خصوصیت Build Action تصویر نیز باید برابر Embedded Resource قرار گیرد. مرحله نهایی در این قسمت تنظیم صفات ToolboxItem و ToolboxBitmap می باشد.

[ToolboxItem(true)]
[ToolboxBitmap(typeof(ImageName))]
public class DividerPanel : System.Windows.Forms.Panel
{

افزودن کلاس Designer

از این کلاس بمنظور انجام تنظیمات مورد نظر و اعمال آن در محیط طراحی استفاده می شود. بدین منظور یک کلاس ایجاد نموده و مطابق کد زیر آنرا اصلاح نمایید.

public class ControlNameDesigner :
System.Windows.Forms.Design.ScrollableControlDesigner
{
}

به عنوان مثال در صورتیکه نیاز داشته باشید یک خصوصیت خاص کلاس در محیط طراحی ظاهر نشود می توانید متد PreFilterProperties را باز نویسی مجدد کرده و خصوصیت مورد نظر را در محیط طراحی حذف نمایید.

protected override void PreFilterProperties(
System.Collections.IDictionary properties)
{
properties.Remove(“BorderStyle”);
}

در انتها با مشخص کردن صفت DesignerAttribute کلاس کنترل، کلاس Designer ایجاد شد را به کنترل معرفی نمایید.

[DesignerAttribute(typeof(ClassNameDesigner))]
public class ControlName : System.Windows.Forms.Panel
{

صفات Assembly و امضا

آخرین قدم در راه ایجاد یک کنترل فراهم کردن اطلاعات لازم برای assembly می باشد. این مرحله اجباری نمی باشد ولی بسیار تاکید می شود که این مرحله را نیز انجام دهید. در ابتدا فایل AssemblyInfo.cs را باز کرده و اطلاعات لازم را در آن وارد نمایید.

[assembly: AssemblyTitle("Control Title")]
[assembly: AssemblyDescription("Control Description")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright Info")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

در ادامه چندین صفت که بطور پیش فرض در این فایل موجود نمی باشد را بصورت زیر به این فایل اضافه نمایید.

// Flagging your assembly with the CLS Compliant attribute
// lets the Framework know that it will work with all
// CLS Compliant languages, and theoretically with all
// future framework platforms (such as Mono on Linux).
// If possible you should avoid using any non-CLS compliant code
// in your controls such as unsigned integers (uint) and
// calls to non-framework assemblies.
[assembly: System.CLSCompliant(true)]

// The ComVisible attribute should always be explicitly set for controls.
// Note that in order for your control to be consumed by
// COM callers, you must use parameter-less constructors
// and you cannot use static methods.
[assembly: System.Runtime.InteropServices.ComVisible(true)]

آخرین مرحله قبل از استفاده از کنترل امضاء نمودن assembly می باشد. امضاء کردن assembly بمنظور جلوگیری از دستکاری و خراب شدن هنگام بارگذاری و یا خراب شدن در اثر download مؤثر می باشد. در ابتدا شما باید با استفاده از ابزار Strong Name که در محیط Command Prompt، محیط Visual Studio.NET می وجود می باشد بمنظور ایجاد یک کلید عمومی/خصوصی برای assembly بصورت زیر استفاده نمایید.

sn -k [outputfile].snk

فایل ایجاد شده را در شاخه پروژه خود کپی کرده و عبارت زیر را در فایل assembly وارد نمایید.

[assembly: AssemblyKeyFile("..\\..\\..\\outputfile.snk")]

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن