مقدمه ای بر WPF
مقدمه
هنگامیکه NET.
برای اولین بار پا به عرصه ظهور گذاشت، تکنولوژیهای جدیدی را در
زمینه برنامهنویسی معرفی نمود. به عنوان مثال میتوان به موارد زیر اشاره
کرد:
ü
یک روش کاملاً جدید برای ایجاد برنامههای
تحت وب (ASP.NET).
ü
یک روش کاملاً جدید برای اتصال به
پایگاههای داده (ADO.NET).
ü
زبانهای نوعامن جدید (#C و VB.NET).
ü
مدیریت برنامهها در زمان اجرا (CLR).
در میان این تکنولوژیها فرمهای ویندوز، که در
واقع کتابخانهای از کلاسهای موجود برای ایجاد برنامههای ویندوزی
میباشد، بیشتر مورد استفاده قرار میگیرد. هر چند فرمهای ویندوز، ابزاری
کامل و با تمام خصوصیات برای ایجاد برنامههای ویندوزی میباشند، اما
وابستگی شدیدی به اساس کار ویندوز دارند که برای بیش از یک دهه تغییرات
زیادی در آن اعمال نشده است.
بیشترین وابستگی فرمهای ویندوز، مربوط به استفاده از APIهای ویندوز به منظور ایجاد یک
نمای بصری برای برنامههای کاربر میباشد. در این مورد میتوان به APIهایی
که برای ایجاد دکمه، جعبه متن و ... استفاده میشود اشاره کرد. بالنتیجه
نمیتوان در کنترلهایی که با استفاده از این روش ایجاد میشوند، تغییرات
زیادی اعمال کرد (تا قبل از پیدایش WPF
اکثر کاربران از همین روش برای ایجاد کنترلهای استاندارد و مورد
نظرشان استفاده مینمودند). به عنوان مثالی در این مورد، اگر بخواهید یک
دکمه با متن درخشان و شیک ایجاد کنید، دیگر نمیتوانید از توابع API
که برای ایجاد کنترل Button در نظر گرفته شدهاند
استفاده کنید. برای این منظور باید ابتدا یک UserControl ایجاد کنید و سپس عملیات ترسیمی مربوط به
جنبههای مختلف دکمه را با استفاده از مدل طراحی سطح پایین انجام دهید.
با تکیه بر مطالبی که در همین سطور بیان گردید،
دیگر نمیتوانید حتی خیال ایجاد جلوههای جالبی که در اکثر برنامههای
گرافیکی استفاده میشود (مانند موجدار کردن دکمهها، منقبض شدن فرمها
و...) در برنامهها را به
ذهنتان راه دهید. زیرا همانطور که اشاره گردید میبایست تمامی جنبههای این
جلوهها را به صورت دستی ترسیم کنید.
اساس نمایشی ویندوز (WPF) برای حل این معزلات یک ساختار
کاری کاملاً جدید را معرفی کرده است. البته WPF از کلیه کنترلهای استانداردی که تاکنون از آنها
استفاده مینمودید، پشتیبانی میکند؛ اما برای ایجاد یک کنترل کلیه ترسیمات
مربوط به متن، حاشیه و پس زمینه را خودش(WPF) انجام میدهد. با این تفاصیل،
WPF میتواند با ارئه
ویژگیهای قدرتمندتری به برنامه نویس اجازه دگرگون کردن روشی که محتوای هر
قسمت از صفحه نمایش رندر میشود را بدهد. با استفاده از این ویژگیها
میتوانید سبک کنترلهای عمومی موجود مانند دکمه را بدون نوشتن کد دوباره
طراحی کنید. به شیوه مشابهای میتوانید با استفاده از اشیاء تبدیل، هر
چیزی که بر روی واسط نمایشی برنامه قرار دارد را دستخوش تغییرات کنید. این
تغییرات عبارتند از:
ü
چرخش
ü
کشیدن
ü
بزرگنمایی
ü
انحراف (کج کردن)
نکته: البته
برای انجام تغییرات ذکر شده درست قبل از ارائه به کاربر میتوانید از سیستم
پویانمایی bake-in که از ابزارهای WPF میباشد، استفاده کنید.
ساختار ویژگیهای جدید در WPF، در واقع یک ساختار جدید و
قدرتمند که براساس DirectX و APIهایِ
گرافیکی سریعِ سخت افزاری، که معمولاً در اکثر بازیهای کامپیوتری مدرن
استفاده میشوند، پایهگذاری شده است. این بدان معناست که برنامهنویس
میتواند از Effectهای گرافیکی جالب، بدون توجه سربار اجرایی که به دلیل
استفاده از فرمهای ویندوزی ممکن است به وجود آید، استفاده کند. در حقیقت
میتوانید از ویژگیهای پیشرفتهای مانند پشتیبانی از فایلهای ویدئویی و
محتویات 3D در فرمهای ویندوزی استفاده کنید.
با به کارگیری این ویژگیها( به همراه یک ابزار طراحی
مناسب) امکان ایجاد واسطهای کاربری تحریک کننده چشم و Effectهای بصری ویژه وجود خواهد
داشت. البته باید مجدداً خاطرنشان کنیم که انجام چنین کارهایی با استفاده
از فرمهای ویندوزی تقریباً غیرممکن است.
با توجه به اینکه ویژگیهای مربوط به پویانمایی، 3D و فایلهای
ویدئویی بیشترین توجه در WPF را معطوف خود میکند،
باید توجه داشته باشید که با استفاده از WPF
میتوانید برنامههای ویندوزی معمولی را با استفاده از خصوصیات بصری
ساده (قدیمی) نیز ایجاد کنید. به عبارت دیگر استفاده از کنترلهای معمولی
تا هنگامی که WPF در فرمهای ویندوزی کار
میکند به سادگی امکان پذیر است. حتی میتوان این طور بیان کرد که WPF ویژگیهایی که مستقیماً به توسعه دهندگان تجاری
میشود را تسهیل بخشیده است. این ویژگیها به طور گستردهای شامل مدل
انقیاد دادهها، یک مجموعه جدید از کلاسها برای چاپ محتویات و مدیریت
صفهای چاپ و یک مشخصه متنی برای نشان دادن متنهای بزرگ قالبدار میشوند.
همچنین یک روش جدید برای ایجاد برنامههای بر مبنای صفحه که به صورت
پیوسته در IE اجرا میشوند و میتوان از طریق یک وب سایت به
آن دسترسی پیدا کرد و آن را اجرا نمود نیز در نظر گرفته شده است. در این
مدل، دیگر اخطارهای امنیتی متداول و تاییدیههای رنجاننده مربوط به نصب را
مشاهده نخواهید کرد.
روی هم رفته WPF، بهترین روشهای قدیمی از دنیای توسعه برنامههای
ویندوز را با ابداعات جدیدی که برای ایجاد واسطهای کاربری مدرن و گرافیکی
توانمند را با هم ترکیب کرده است. با توجه به اینکه برنامههای ویندوزی به
عمر چندین ساله خود ادامه میدهند، توسعه دهندگانی که به یک پروژه جدید
ویندوزی میپردازند بهتر است از WPF
استفاده کنند.
WPF
یک چارچوب نمایشی کاملاً جدید است که تواناییهای بسیاری از
چارچوبهای قبلی را مانند GDI+، GDI، User
و HTML با یکدیگر ترکیب کرده است و توانایی تاثیر گزاری
بر روی ابزارهای ایجاد پویانمایی در وب مانند Flash را نیز دارد. البته بر
روی برنامههای ویندوزی مانند Microsoft Word نیز تاثیرگذار است.
معرفی WPF
اساس نمایشی ویندوز یک سیستم نمایش گرافیکی
جدید برای سیستم عامل ویندوز میباشد. این تکنولوژی برای NET. طراحی شده
است و همچنین تاثیر زیادی بر تکنولوژیهای نمایشی جدیدی مانند HTML و Flash داشته و باعث بهینه سازی سرعت سخت افزار
میگردد. WPF شامل تغییرات بنیادینی در
زمینه واسط گرافیکی ویندوز از زمان Windows 95
میباشد.
در این مقاله سعی بر این داریم که ساختار این تکنولوژی را مورد
بررسی قرار دهیم: ابتدا به نحوه کارکرد آن نگاهی خواهیم داشت و در نهایت
مواردی که این تکنولوژی برای نسلهای بعدی برنامههای ویندوز متعهد شده است
را مورد بررسی قرار میدهیم.
درک گرافیک ویندوز
درک مزایای مهیج و زیبای WPF
بدون پی بردن به این نکته که چگونه برنامه نویسان ویندوز از
تکنولوژیهای نمایشی مشابه و یکسان برای بیش از 10 سال استفاده میکردند
واقعاً سخت است.
یک برنامه ویندوزی جدید که با
زبان #C و یا VB.NET نوشته میشود، به صورت غیر مستقیم به دو بخش
اصلی سیستمعامل ویندوز برای
ایجاد واسط گرافیکیاش وابسته است:
ü
User32: این قسمت عهدهدار
فراهم آوردن نمایی شبیه ویندوز برای برنامه است و با عناصری مانند فرمها،
دکمهها، جعبههای متن و ... سر و کار دارد.
ü
GDI/GDI+: این قسمت پشتیبان ترسیمی برای ایجاد اشکال،
متنها و تصاویر در قبال هزینۀ پیچیدگیهای اضافی در برنامه میباشد (البته
معمولا عملکرد آن بی زرق و برق است).
هر دو تکنولوژی در سالهای متمادی مورد
بازبینیهای متعدد قرار گرفتند و APIهایی
که برای تعامل برنامه نویسان با آنها در نظر گرفته شده بودند نیز
تغییرات چشمگیری داشته اند. اما هنگامی که برنامه نویسان قصد داشتند در
برنامه ای (چه با #C و NET 2.0
و یا زبانهای قدیمیتر مانند VB6
و حتی کدهای برپایه ++MFC C)
اقدام به ایجاد تصاویر دستی کنند قسمتهای یکسانی از سیستم عامل
ویندوز در پشت پرده در حال کار بودند. Frameworkهای جدیدتر روشهای بهتری
برای تعامل با User32 و همچنین +GDI/GDI ارائه
کردند. این روشها بهبودهای زیادی در کارآیی برنامه، کاهش پیچیدگی برنامه
به همراه داشتند. البته این روشها ویژگیهایی نیز اضافه میکردند که با
استفاده از آنها برنامه نویس نیازی به کدنویسی زیاد نداشت. اما این روشها
نیز نتوانستند محدودیتهای اساسیِ اجزای اصلی سیستم که بیش از یک دهه از
طراحی آن میگذشت را حذف کنند.
نکته: اساسیترین تقسیم وظایف میان
User32 و +GDI/GDI حدود
۱۵ سال پیش ارائه شده بود و برای Windows 3.0
دارای ساختاری مناسب بودند. البته در آن زمان User32
در واقع با نام User معرفی گردید زیرا هنوز
سیستمهای 32 بیتی ایجاد نشده بودند.
DirectX: موتور گرافیکی جدید
مایکروسافت برای رهایی از محدودیتهای موجود در
کتابخانههای User32
و
+GDI/GDI تکنولوژی جدیدی را مورد استفاده قرار داد. این تکنولوژی در
واقع همان DirectX میباشد. DirectX
به عنوان یک ابزار مستعد خطا و متحد برای ایجاد بازی های کامپیوتری
بر روی پلتفرم ویندوز کار خود را آغاز کرد.
هدف اصلی در طراحی DirectX افزایش سرعت بود؛ از
اینرو مایکروسافت به تعمال نزدیکی با سازندگان کارتهای ویدئویی به منظور
فراهم کردن شتاب سخت افزاری لازم که برای الگوهای گرافیکی پیچیده لازم
بودند و همچنین effectهای
ویژه ای مانند شفافیت و گرافیک سه بعدی پرداخت.
این تکنولوژی در طول سالهای بعد از اولین انتشارش (مدتی
بعد از Windows 95) رشدهای قابل ملاحظهای داشته است و هم اکنون یکی از
اجزای لاینفک در سیستم عامل ویندوز میباشد که از تمامی کارتهای ویدئویی
پشتیبانی میکند. اگرچه APIهای
برنامه نویسیِ DirectX هنوز هم اساس کار آن را
به عنوان ابزاری برای توسعه بازی معرفی میکنند، اما به علت پیچدیگی زیاد
کار با آنها، از DirectX تقریباً در هیچ یک از
برنامههای ویندوزی (مانند برنامههای تجاری)استفاده نمیشود.
WPF تمامی این مشکلات را برطرف کرده است. در WPF از تکنولوژیهای +GDI/GDI به عنوان پایه کار
استفاده نمیشود. در عوض از DirectX استفاده میشود. در
برنامههای WPF بدون توجه به اینکه
برنامه نویس چه واسط کاربری را ایجاد میکند از DirectX
استفاده میشود. این بدان معناست که اگر شما بخواهید یک طرح گرافیکی
پیچیده و سه بعدی ایجاد کنید و یا یک دکمه به همراه متنی آشکار ایجاد کنید،
تمامی کارهای ترسیمی از طریق DirectX انجام میشود. بالنتیجه،
میتوانید در تمامی برنامههای تجاری میتوانید به سادگی از effectهای
غنی را بدون هیچ مشکلی به کار برید. همچنین میتوانید از مزایایِ
شتابدهنده سختافزاری نیز بهرهمند شوید. این بدان معناست که DirectX به کارهایِ زیادی که به
GPU مرتبط است دخالت نمیکند و به انجام کارهای دیگری میپردازد.
نکته: GPU
یک پردازشگر مجزا است که بر روی کارتهای ویدئویی نصب میشود.
نکته: DirectX
نسبت به +GDI/GDI کارآیی بهتری دارد؛ زیرا
درک دقیقی از عوامل سطح بالا مانند گرادیانها (شیب) و همچنین الگوها را که
میتوانند مستقیماً توسط کارت ویدئویی انجام شوند را دارد اما +GDI/GDI از
این مزیت بیبهرهاند. از اینرو برای انجام چنین کارهایی توسط +GDI/GDI باید دستورات مربوطه را به دستورات پیکسل به
پیکسل تبدیل کرده و سپس اجرا کنید. بدیهی است که این عمل مدت زمانی
طولانیتری را به خود اختصاص میدهد و بسیار کند عمل میکند.
تنها عنصری که هنوز در صحنه حاضر
است User32 (با کمی محدودیت)
میباشد. این امر بدان دلیل است که WPF
هنوز از User32 برای انجام سرویسهای
خاصی مانند اجرای دریافت ورودیها ودستهبندی اینکه هر برنامه دربردارنده
چه قسمتی از صفحه نمایش میباشد. با این حال کلیه عملیات ترسیمی توسط
DirectX انجام میپذیرد.
نکته: باید توجه داشته باشید که WPF یک
روپوش جدید برای +GDI/GDI نیست؛ بلکه یک جایگزین برای آنها میباشد. (یک
لایه جدید که با DirectX کار می کند)
نکته: در پشتیبانی نرمافزاری WPF یک
حالت استثناء وجود دارد. به علت پشتیبانی ضعیف راهاندازها، WPF فقط هنگامی
عمل خوشنماسازی را برای ترسیمات 3D انجام میدهد که برنامه بر روی ویندوز
Vista اجرا گردد (همچنین باید یک راهانداز محلی در ویندوز ویستا برای کارت
ویدئویی نیز داشته باشید). این بدان معناست که اگر تصویر سه بعدی را بر روی
سیستم عامل Windows XP رسم کنید، احتمالاً با لبههایی دندانهدار در
انتها تصویر مواجه خواهید شد. اما اگر همان تصویر را در Windows Vista اجرا کنید لبههای تصویر
روان و سلیس خواهند بود. خوشنماسازی برای ترسیمات 2D بدون در نظر گرفتن
سیستم عامل پیادهسازی شده است.
نکته: با داشتن یک کارت
ویدئویی قدرتمند، تضمینی برای داشتن سرعت و کیفیت در WPF وجود ندارد.
نرمافزارها در این مورد نیز نقش مهمی را ایفا میکنند.
نکته: هدف اصلی WPF
پردازش کارهای گرافیکی توسط GPU برای میباشد. به جای
استفاده از CPU اصلی کامپیوتر برای
پردازش روتینهای گرافیکی پیچیده از GPU
که بر روی کارت گرافیکی به صورت مجزا وجود دارد استفاده میشود. با این کار
CPU برای انجام فعالیتهای دیگر آزاد باقی میماند و
از کارت ویدئویی استفاده مناسب و حداکثر صورت خواهد گرفت.
درجه بندیهای WPF
کارتهای ویدئویی بسیار با یکدیگر متفاوت
میباشند. هنگامی که WPF یک کارت ویدئویی را مورد
دسترسی قرار میدهد، فاکتورهای مهمی را مد نظر قرار میدهد:
ü
میزان حافظه RAM در آن کارت.
ü
پشتیبانی از پیسکلهای سایهدار.
ü
پشتیبانی از vertexهای
سایه دار.
ü
....
بر اساس این جزئیات به هر کارت گرافیکی یک
مقدار برای درجه اجرایی داده میشود. مقادیر انتسابی به سه دسته زیر تقسیم
میشوند:
ü
Rendering Tire 0:
کارتهای ویدئویی با این درجه، از هیچگونه شتاب (بهینگی)
سختافزاری پشتیبانی نمیکنند. این درجه معادل استفاده از نسخههای
DirectX 7.0 به پایین میباشد.
ü
Rendering Tire 1:
کارتهای ویدئویی این دسته قسمتی از خصوصیات شتاب سختافزاری را
پشتیبانی میکنند. این درجه معادل استفاده از
DirectX 7.0 تا DirectX 9.0
می باشد.
ü
Rendering Tire 2:
کارتهای این قسمت، از تمامی ویژگیهای شتاب سختافزاری حمایت
میکنند. این دسته معادل استفاده از DirectX 9.0 به بالا می باشد.
ممکن است بخواهید درجهای که برای
کارت گرافیکی شما در نظر گرفته شده است را مشاهده کنید. برای این کار
میبایست مقدار خصوصیت Tier که در کلاس
System.Windows.Media.RenderCapability
وجود دارد را بازیابی کنید. برای تطبیق این مقدار با درجه بندیهای
فوق میبایست مقدار خصوصیت Tier را 16 بیت به سمت راست
شیفت دهید. در زیر نمونه این کد آورده شده است:
int
renderingTier = (RenderCapability.Tier >> 16);
نکته: برای استفاده از کلاسهای موجود
در فضانام فوق میبایست اسمبلی PresentationCore را به Referenceها اضافه
کنید.
WPF: یک API با سطح بالاتر
اگر شتاب سختافزاری با استفاده از DirectX را به عنوان تنها پیشنهاد WPF
در نظر بگیریم، آنگاه این تکنولوژی چیزی جز یک بهبود در عمل کامپایل
نخواهد بود و نمیتوان آن را به عنوان یک حرکت انقلابی در زمینه کارهای
ترسیماتی به حساب آورد. WPF برای ایجاد یک حرکت
دگرگونساز سرویسهای سطح بالایی را برای برنامه نویسان فراهم آورده است.
این سرویسها عبارتند از:
یک مدل آرایشی تارمانند: WPF به جای ارائه کنترلهایی
ثابت و با گوشههای مشخص، بر روی یک صفحه آرایی انعطاف پذیر که در آن
میتوان کنترلها را بر اساس محتوایشان تنظیم کرد، تاکید فراوان دارد.
نتیجه این تاکید ایجاد یک واسط کاربری که میتوان آن را برای نمایش محتویات
پویا سازگار کرد میباشد.
یک مدل ترسیماتی غنی: در WPF
به جای رسم کردن پیکسلها با چند مورد از اشکال پایهای و ابتدایی،
بلوکهای متنی و عناصر گرافیکی دیگر سروکار خواهیم داشت. البته در میان
مزایای فوق نباید پشتیبانی ذاتی از ترسیمات
3D را از یاد برد.
نکته: پشتیبانی از ترسمیات از ترسمیات
3-D در WPF
قدرت برابری با OpenGL و یا Direct3D را ندارد. اگر قصد دارید
که برنامهای که ترسیمات سه بعدی سنگینی را در بردارد پیادهسازی کنید
(مانند بازیهای امروزی) WPF 1.0 احتمالاً جوابگوی کار شما نخواهد بود.
یک مدل متنی غنی: سالها پس
از نشان دادن متنها در کنترلهای ضعیفی مانند Labelها، WPF
برای برنامههای ویندوز قابلیت نشان دادن متنها با سلیقههای مختلف
در هر نقطه از واسط کاربری را به ارمغان آورده است.
پویانمایی به عنوان بهترین مفهوم برنامه
نویسی: تاکنون میتواستید با استفاده از زمانسنج فرم برنامه را مجبور
به دوبارهسازی خودش کنید. اما در WPF، پویانمایی یک جز طبیعی و ذاتی در
Framework میباشد. برای این منظور
ابتدا انیمیشنها را با استفاده از تگهای اعلانی تعیین میکنیم و سپس WPF آنها را در دستور کار
قرار میدهد.
پشتیبانی از رسانههای صوتی و تصویری:
ابزاری های ایجاد واسط کاربری که قبلاً مورد استفاده قرار می گرفتند مانند
فرمهای ویندوزی برای کار با رسانههای صوتی و تصویری به صورت چشمگیری
محدود بدوند. اما WPF
این مشکل را برای برنامه نویسان رفع کرده است.
سبکها و قالبها: با استفاده
از قالبها و سبکها میتوانید نحوه رندر شدن عناصر برنامه و ... را به
صورت دلخواه تغییر دهید.
دستورات: برای بسیاری از کاربران انجام
یک کار چه از طریق منوها با نوار ابزار فرقی ندارد؛ زیرا نتیجه هر دو یکسان
است. به همین منظور با استفاده از WPF
می توان دستورات را در جایی قرار داد و به آنها اشاره کرد.
واسط کاربری اعلانی: هر چند
برنامه نویسان میتوانند پنجرههای WPF را با استفاده کدنویسی ایجاد کنند، اما VS.NET از روش دیگری استفاده میکند. VS.NET هر عنصر در پنجره را به صورت تگهای XML در XAML
ایجاد میکند. مزیت این کار جداسازی کدهای اصلی برنامه از کدهای
مربوط به واسط کاربری میباشد. همچنین update کردن واسط با استفاده از
ابزارهایی که برای این منظور در نظر گرفته شده است بسیار راحت تر خواهد
بود.
برنامه های براساس صفحه: با استفاده از
WPF، می توانید برنامههایی مانند مرورگرها ایجاد کنید. این برنامهها به
شما اجازه میدهند در مجموعه صفحات حرکت کنید، اطلاعات را کامل کنید و با
استفاده از دکمهها foreward/backward
به صفحههای بعد و قبل حرکت کنید.
ساختار ارتباطی WPF
با یک نگاه به تصویر زیر معماری WPF را درک خواهید کرد.
