مقدمهای بر WPF
بنیاد نمایش ویندوز(ترجمه Windows Presentation Foundation یا به اختصار WPF) یک سیستم پیشرفته نمایشی برای سیستمعامل ویندوز میباشد و چارچوبی است برای ایجاد برنامههای خیرهکننده. در انجمن داتنت یکی از محبوبترین تکنولوژیها در برنامهنویسی دسکتاپ میباشد. در این مقاله به صورت مختصر درباره این تکنولوژی صحبت خواهمکرد. لازم به ذکر است این مقاله گردآوری شده از منابع مختلف از جمله کتاب Pro WPF 4.5 in C# نوشته متیومکدونالد، ویکیپدیا و کدپروجکت و ... میباشد.
درسال 2006 و با آمدن داتنتفریمورک 3.0 اولین ورژن از WPF جهت کار عرضه شد(اولین نسخه شد WPF3.0) که آوالون(Avalon) نیز نامیدهمیشد. استفاده از دایرکتایکس، توانایی تعریف رابط کاربری با استفاده از زمل(XAML)، خواص وابسته(Dependency Property)، دیتابایندینگ(Data Binding) و استایل و تمپلیت جز قابلیتهای اصلی WPF میباشد که در ادامه به جزء درباره آنها سخنگفتهخواهدشد. به مدت حدود 15 سال فریمورک(FrameWork) ویندوز دو رابط کاربری کاملا جدا از هم داشت که عبارتند از:
- User32: رابطی که هر المان در ویندوز را بصورت پنجره(Window)، تکستباکس(TextBox)، دکمه(Button) و ... میبیند. این رابط بیشتر برای طراحی نرمافزارهای کاربردی فرمبیس(FormBase) میباشد(همه این المانها دارای یک hWnd یا هندل(Handle) یکتای مربوط به المان هستند).
GDI/GDI+ : رابطی برای کشیدن شکل و متن(البته با پیچیدگی بسیار) و رنگآمیزی و ...(برای برنامهنویسی گرافیکی در این محیط لازم بود از توابع API و دیوایسهندل(Device Handle که بیشتر با hdc شناخته میشد استفادهکرد) میباشد، به عنوان نمونه میتوان از توابعی چون GetPixel، SetPixel، LineTo و ... که همگی درون کتابخانه(Library) GDI32قراردارند نامبرد این رابط بیشتر برای طراحی بازی مورد استفاده بود.
این دو رابط کاربری کاملا از هم جدا بودند تا اینکه ویندوز اقدام به ارائه موتور گرافیکی جدیدی به نام دایرکتایکس(DirectX) کرد. دایرکتایکس یک نرمافزار گرافیکی برای اتصال دو رابط کاربری بود.(بیشتر مانند وصله کردن) از مزایای آن، کار با همه کارتهای گرافیکی میباشد، دایرکتایکس اولیه برای کارهای گرافیکی مانند طراحی بازی مناسب بود چراکه هنوز پیچیدگی زیادی داشت و نمیشد برای برنامههای کاربردی غیرگرافیکی استفادهکرد. دایرکت ایکس با آمدن ویندوز95 در درون آن قرار گرفت. با آمدن WPF کل ساختار تغییر کرد، در قلب WPF دایرکتایکس بجای GDI قراردارد، با WPF میتوان با هردو رابط کاربری دریک زمان کارکرد. یعنی میتوان همزمان دریک فرم هم تکستباکس داشت هم یک شکل گرافیکی(مثلا نمودار میلهای).
WPF به عنوان یک API سطح بالا
WPFشامل مجموعه سرویسهای سطح بالا برای برنامهنویسی برنامههای کاربردی میباشد. در زیر چند نمونه از قابلیتهای آن را نام میبریم.
- مدل جانمایی مانند وب(Web-like layout model): در برنامهنویسی برپایه فرمبیس و بدون WPF شما برای هر شی(مانند یک تکستباکس) یک مکان مشخص با مختصات معلوم در صفحه یا فرمتان تعیین میکنید و با کوچک یا بزرگ شدن فرم، مکان آن شی تغییر نمیکند. اما در برنامهنویسی برپایه WPF مکان اشیا و جانمایی اشیا کاملا انعطافپذیر میباشد(درست مانند صفحههایی برپایه وب). درWPF جانمایی میتواند با تغییر محتوای(Content) شی هم تغییر کند.(در آینده بیشتر در اینباره خواهیم گفت)
- مدل طراحی قدرتمند(Rich drawing model): در کارهای گرافیکی، طراحی برپایه پیکسل میباشد. اما در WPF شما با یک سری کنترلهای گرافیکی اصلی و پایهای(Primitives objects and controls) سروکار دارید.
- مدل متنی نیرومند(Rich text model): در محیط فرمبیس(Form base) شما امکان ایجاد یک متن با قابلیت تغییر فونت و اندازه وبه طورکلی استایل(Style) را دارید(به این شی یا تکستباکس، ریچتکستباکس RichtextBox میگویند) اما امکان آنکه بخواهید عکس، جدول و ... را درون متن قراردهید فراهمنیست اما در WPF تمامی این امکانات به همراه امکاناتی چون نمایش متنهای بزرگ(یکی از محدودیتهای ریچتکستباکس تعداد کاراکتر میباشد) نیز وجود دارد.
- پشتیبانی از ویدئو و صدا: در برنامه فرمبیس امکان داشتن فیلم و یاصدا محدود بود اما در WPF این محدودیتها برداشته شده مثلا حتی میتوان یک فیلم را درون یه وجه از یک شکل 3بعدی درحال چرخش نمایشداد.
- استایلها و تمپلیتها(Styles and Templates): استایل به شما اجازه میدهد قالب نمایش را استانداردسازی کرده و در کل برنامه از آن استفاده کنید. تمپلیت به شما امکان میدهد نوع رندر(Render) را تغییر دهید. مثال: فرض کنید یک کامبوباکس دارید با استفاده از استایل شما رنگبندی، فونت، بردر(Border) و ... را تعریف کرده و تغییر دهید، با تمپلیت شما میتوانید شکل کامبوباکس را تغییر دهید مثلا بجای نوشته، یک کامبو با عکس بسازید و یا بجای کامبوباکس مستطیل شکل، کمبوباکس دایرهای شکل بسازید.(این دو قابلیت از شگفتانگیزترین قابلیتهای WPF است که امکانات وسیعی در جهت تغییرات به شما میدهد).
- کامندز(Commands): این قابلیت شگفتانگیزی میباشد، فرض کنید یک منو تعریف کردهاید تا عمل Save انجام دهد در حالت فرمبیس در پشت صحنه باید با انتخاب منو عمل ذخیره انجام شود. واگر بخواهید همینکار در تولبار(Toolbar) انجام شود لازم است پشت دکمه(Button) تولبارتان نیز همین کد را قراردهید. اما کامندز به شما این امکان را میدهد فارغ از تولبار و یا منوبار این عمل انجامشود.
- رابط کاربری تعریفپذیر: با اینکه مانند فرمبیس شما میتوانید کلیه اشیا را با استفاده از کد درون فرم قراردهید اما یک رویکرد دیگر در WPF وجود دارد که قابلیت بسیار دارد. در WPF با استفاده از تگهای ایکسامال(xml Tags) در محیط زمل(xaml) میتوانید اشیا را درون پنجره(Window) قراردهید. این قابلیت این امکان را فراهممیکند تا کاملا جدا از محیط کدنویسی اقدام به چیدمان اشیا در پنجره نمایید.
- برنامه صفحه پایه(Page base Application): با WPF میتوان یک برنامه مشابه صفحههای وب با امکان رفتن به صفحه های قبلی و بعدی و ... نوشت.
یکی از مزایای بکارگیری WPF استفاده از Device Independent units است. که هر یک واحد از آن معادل یک نودوششام اینچ است.
1 Device Independent units = 1/96 inch.
دراین باره ومزایای استفاده از آن بعدا توضیح دادهخواهدشد. تمامی پنجرهها و تمامی اشیای درون WPF از این واحداندازهگیری استفاده میکنند.
WPF یک موتورگرافیکی وکتوربیس
تفاوت اصلی میان بیتمپبیس(Bitmap Base) و وکتوربیس(Vector Base) در این است که در حالت بیتمپ، یک شکل با پیکسل مشخص میگردد که با تغییر رزولوشن و یا DPIسیستم تصویر محو یا حالت مهگرفته(Blurring) میگردد(این مورد را میتوانید با تغییر رزولوشن مانیتورتان مشاهدهکنید) اما درحالت وکتوربیس هرشکل نه از پیکسل بلکه از اجتماعی از شکلهای کوچک تشکیل شده و با تغییر رزولوشن و یا DPIسیستم تصویر حالت مهگرفته پیدا نمیکند. برای مثال(البته این حرف چندان دقیق نیست ولی فهم موضوع را آسانتر میکند) یک پیکسل سبز رنگ درواقع یک مربع یا دایره سبز رنگ است که با تغییر رزولوشن شکل مربع تغییر نمیکند و فقط ابعاد آن تغییر میکند.
تصویر مهگرفته
سلسلهمراتب(Hierarchy)
WPFمانند همه سیستمهای دیگر دارای یک سلسهمراتب میباشد. در زیر، عکسی از سلسهمراتب کلاسها(Class Hierarchy) ارائهمیگردد و در ادامه به توضیح مختصری از هر کلاس(از پایینترین کلاس به بالاترین) خواهیمپرداخت:
ساختارسلسلهمراتبی
- System.Threading.DispatcherObject: برنامههای نوشتهشده برپایه WPF از سیستم تکنخی(single-thread) استفادهمیکنند بنابراین تعامل با المانهای مربوط به رابط کاربری از یک نخ دیگر ایمن نیست(به عنوان مثال وقتی چندبرنامه تک نخی درحال اجرا هستند و اطلاعاتی از کیبورد یا موس و یا از درگاههای دیگر ارسال میگردد باید مشخص گردد این اطلاعات مربوط به کدام برنامه است). هر برنامه برپایه WPF، یک دیسپچر(Dispatcher) که آن برنامه را کنترل میکند در اختیار دارد. وقتی اطلاعاتی دریافت میشود دیسپچر مشخص میکند کدام برنامه این اطلاعات را دریافت میکند.(برای آگاهی بیشتر به این لینک و برای یک نمونه به اینجا مراجعه شود).
- System.Windows.DependencyObject: در WPF هرگونه تعامل با عناصر و المانها از طریق خواص(Properties) انجام میشود. در ساختار و معماری WPF هدف این بود که با تغییر خاصیتی(Property) بلافاصله بتوان آگاهی یافت که کدام خاصیت تغییرکرده و این تغییر چیست(یعنی شما میتوانید با تغییر یک خاصیت(Property) یک برنامه را فعال(Trigger) کرده و اجرا کنید) هدف دیگر ارثبری مقدار اولیه و ذخیرهسازی بهینه اطلاعات و خصوصیتها بود. همه اینها با DependencyObject امکانپذیر میگردد.
- System.Windows.Media.Visual: هر عنصر در WPF در درون یک Visual قراردارد. به زبانی ساده کار Visual کشیدن عنصری است که در درونش قراردارد(هرگونه کشیدن(Drawing)، رنگآمیزی(Fill)، چرخاندن(Rotate)، ناشفافسازی یا کدرسازی(Opacity)(ببخشید اگر ترجمه فارسی برخی واژهها از نوشتن به زبان انگلیسی سختتر است) و انتقال(Transformation) توسط ویژوال انجاممیشود. از وظایف دیگر آن هماهنگی با رندرکننده صفحهنمایش است. برخی از برنامهنویسان برای برنامههایی که خیلی نیاز به امکانات سطح بالای WPF ندارند بطور مستقیم از Visual استفاده میکنند(دراینباره در مقالات بعدی توضیح خواهم دارد)
- System.Windows.UIElement: برای سادگی در فهم با یک مثال شروع میکنیم، اگر با برنامهنویسی Win32 کارکرده باشید(بخصوص اگر از توابعی چون Sendmessage و Postmessage استفاده کردهباشد) حتما میدانید برای تبادل اطلاعات میان اشیا(مثلا یک تکستباکس یا یک فرم ...) از یک طرف و کیبورد و موس و ... نیاز به یک هندل(Handle) دارید تا مشخص کنید تبادل شما با کدام پنجره میباشد(هر شی و یا پنجره در Win32 دارای یک هندل یکتا که بیشتر با hWnd شناخته میشود میباشد برای آشنایی بیشتر به این صفحه مراجعهشود) UIElement همانند هندل برای WPF عمل میکند. هرگونه تبادل داده و ارتباط با موس و کیبورد و ... با اشیا در WPF توسط UIElement انجام میگردد. البته این تنها وظیفه UIElement نیست بلکه یک کلاس سطح بالاتر است که قابلیت ارثبری دارد.
- System.Windows.FrameworkElement: آخرین قدم در درخت وراثت WPF، فریمورکالمنت از کلاس UIElement ارث میبرد و شامل برخی ویژگیهای خاص مانند HorizontalAlignment و Margin و ... میباشد.
- System.Windows.Shapes.Shape: کلاس شکلهای پایهی WPF مانند مستطیل(Rectangle)، چندضلعی(Polygon)، بیضی(Oval)، خط(Line) و مسیر(Path) و... .
- System.Windows.Controls.Control: یک کنترل المانی است که میتواند با کاربر تعامل داشته باشد(توجه کنید در برنامهنویسی فرمبیس هر عنصر درون فرم حتی خود فرم هم یک کنترل محسوب میشود اما در WPF فقط عناصری که تعامل با کاربر دارند و امکان فوکسFocus دارند کنترل هستند)، کلاسهای تکستباکس، کومبوباکس، لیستباکس، چکباکس، دکمه(Button) و ... همگی درون کنترل قراردارند. از خاصیتهای(Properties) کنترل میتوان از فونت، رنگ پیشزمینه(فونت)(Foreground)، رنگ پسزمینه(Background) و ... نام برد. یکی از ویژگیهای خاص و زیبای کنترل پشتیبانی از قالب(Template) میباشد که باعث ایجاد انواع کنترلها با کاربردهای بسیار شود(مثلا یک چکباکس را از نظر ظاهری تبدیل به دکمه خاموش و روشن نمایید و یا یک تکستباکس بیضیگون بسازید).
- System.Windows.Controls.ContentControl: شامل همه المانهایی است که دارای محتوا(Content) هستند. شگفت انگیزترین بخش ماجرا اینجاست که این محتوا میتواند از یک متن تا یک شکل یا پنل(Panel) و هرچیزی که تصور کنید باشد.
- System.Windows.Controls.ItemsControl: کلاس پایه برای همه المانهایی است که خود مجموعهی از آیتمها هستند مانند لیستباکس، درخت(TreeView). این کلاس بسیار منعطف است چرا که میتوان آیتمهای لیستباکس را بجای متن با شکل و نوشته و یا حتی با انواع عکسها جایگزین کرد.(منوبار و نوار ابزار و ... همگی از این کلاس مشتق میشوند).
- System.Windows.Controls.Panel: این کلاس پایه برای همه کانینرها(Containers) میباشد، کانتینر عنصری است که در درونش میتوان اشیای دیگری بهعنوان فرزند با چیدمانی خاص قرارداد. مانند کانواس(Canvas) و استکپانل(StackPanel) و ... .
با کمی دقت متوجه میشوید همه کلاسها بجز DispatcherObject با نیماسپیس(namespace) System.Windows آغاز میشوند. ابزارهای کمکی مختلفی برای کاربا WPF طراحی و ساخته شده به عنوان نمونه میتوان از Xceed، Telerik، DotNetBar، DevExpress و ... نام برد(برای دانلود و نصب هر کدام از این ابزارهای کمکی میتوانید در اینترنت جستجو کنید و البته میتوانید از سایتهایی چون سافت98 و یا پیسیدانلود کمک بگیرید)، در این سایت سعی براین است تا کاربا ابزار کمکی Telerik آموزش دادهشود اما در کنار آن گاهی گریزی به خود WPF نیز زدهخواهدشد.



