ساختار کلی یک برنامه WPF

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

 1: <Window x:Class     ="WpfApp1.MainWindow"
 2:         xmlns       ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3:         xmlns:x     ="http://schemas.microsoft.com/winfx/2006/xaml"
 4:         xmlns:d     ="http://schemas.microsoft.com/expression/blend/2008"
 5:         xmlns:mc    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6:         xmlns:local ="clr-namespace:WindowDemo"
 7:         mc:Ignorable="d"
 8:         Title="MainWindow" Height="200" Width="300">
 9:     <Grid>
10: 
11:     </Grid>
12: </Window>

در قطعه کد بالا، ساده‌ترین شکل یک فایل XAML را می‌بینید. اگر خوب دقت کنید، کد فوق دارای دو تگ کلی می‌باشد. یکی تگ Window و دیگری تگ Grid می‌باشد. تگ Window بیانگر این است، که این فایل اشاره به یک کلاس Window دارد. همانطور که قبلاً گفتم Window ها در WPF همانند Form ها در Windows Form می‌باشند.
تگ Grid اشاره به کلاسی به نام Grid دارد که یکی از پر کاربردترین کلاس‌های WPF می‌باشد که جزء کنترل‌های Container است. این کنترل به همراه کنترل‌های دیگر که همه از کلاسی به نام panel ارث بری می‌کنند، وظیفه طرح بندی (Layout) پنجره‌های شما را دارند در مورد این کنترل به همراه کنترل‌های مربوطه، در بخش Layout مفصل صحبت خواهم کرد. در خط اول قطعه کد فوق، دستور زیر را مشاهده می‌کنید:

x:Class="WpfApp1.MainWindow"

این دستور، بیانگر این است که فایل XAML جاری، مربوط به کلاس MainWindow که در فضای نام WpfApp1 قرار گرفته است می‌باشد. به عنوان مثال چناچه یک Button به فایل XAML فوق اضافه کنید، و برای آن رویدادی (مثلاً Click) تعریف کنید، کدهای این رویداد درون کلاس MainWindow در درون فضای نام WpfApp1 خواهد بود.
این موضوع باعث جدایی واسط کاربری ما از منطق برنامه می‌شود. علاوه بر این شما می‌توانید، فایل‌های XAML را به صورت پویا و در هنگام زمان اجرای برنامه، فراخوانی کرده و توسط آنها، واسط کاربری پنجره مربوطه را ایجاد نمایید. حال به خطوط 2 و 3 توجه کنید. این دوخط، دو فضای نام کلی را در برنامه‌های WPF مشص می‌کند. در واقع هر سند XAML مربوط به WPF شامل این دو فضای نام خواهد بود. هر سند XAML مربوط به WPF بایستی این دو فضای نام را در خود تعریف کند. فضای نام اول (خط 2)، در برگیرنده تمامی کلاس‌های WPF و کنترل‌های و … که جهت ایجاد واسط‌های کاربری، به کار گرفته می‌شوند، می‌باشد.

فضای نام دوم (خط 3)، در واقع شامل انواع کاربردهای XAML می‌باشد که به شما اجازه نظارت بر تولید و شبیه سازی اسناد XAML را می‌دهد. همانطور که مشاهده می‌کنید، این فضای نام دارای پیشوند x می‌باشد. این بدان معنی است که در هر جایی از سند XAML که بخواهید از عناصر درون این فضای نام استفاده نمایید، بایستی کدی مشابه کد زیر بنویسید:

<x: [ElementName]>

عناصری که از این فضای نام قابل دسترسی خواهند بود، بسته به عنصری که از این فضای نام استفاده می‌کند، متفاوت می‌باشد. با به کار بردن کلمه xmlns می‌توانید فضای نام های مورد نظر را در اسناد XAML خود، تعریف کنید. قاعده نحوی تعریف فضای نام ها به صورت زیر می‌باشد:

xmlns="clr-namespace: [NameSpace Name];assembly=[Assembly Name]"

در تعریف فوق، به جای [NameSpace Name] بایستی نام فضای نام مربوطه را قرار دهید. و به جای [Assembly Name] بایستی نام فایل اسمبلی را که آن فضای نام در آن قرار گرفته است را، قرار دهید. برای درک بهتر موضوع، به یک مثال توجه کنید. فرض کنید که یک کلاس اختصاصی با عنوان AdvanceMathClass ایجاد کرده‌اید، که این کلاس، در فضای نام MathClasses و در اسمبلی MyCustomClasses قرار دارند. حال برای دسترسی به کلاس AdvanceMathClass بایستی فضای نام آن را و نیز اسمبلی که آن کلاس در آن قرار گرفته است را، مشخص نمایید.
با توجه به توضیحات پیشین، بایستی دستور زیر را در ابتدای فایل XAML خود اضافه نمایید:

xmlns="clr-namespace:MathClasses;assembly=MyCustomClasses"

حال می‌توانید به راحتی از کلاس AdvanceMathClass در سند XAML خود استفاده کنید. می‌توانید برای فضای نام های موجود، یک اسم مستعار معرفی کنید و از آن اسم در برنامه خود استفاده نمایید. به عنوان مثال می‌توانید کدی به صورت زیر داشته باشید:

using sys=System;

توسط این کد، شما نام مستعار sys را برای System انتخاب کرده‌اید. حال به راحتی می‌توانید از کلمه sys به جای کلمه Systsem در برنامه خود استفاده کنید و به فضای نام ها و کلاس‌های داخلی آن دسترسی داشته باشید. در فایل‌های XAML نیز می‌توانید، عملی مشابه به این را انجام دهید. به قطعه کد زیر توجه کنید:

xmlns:cc="clr-namespace:MathClasses"

همانطور که مشاهده می‌کنید، از کلمه cc به عنوان نام مستعار برای فضای نام مذکور، استفاده شده است. حال می‌توانید توسط این کلمه به کلاس‌های درون فضای نام خود دسترسی داشته باشید.

در نهایت، سه خاصیت برای Window تعریف شده است. خاصیت اول، مربوط Tilte پنجره می‌باشد. این خاصیت مانند خاصیت Text در فرم‌های ویندوزی می‌باشد. در واقع متنی که به عنوان مقدار در این خاصیت قرار بگیرد، به نوار عنوان پنجره و همچنین در زمانی که پنجره در حالت minimize قرار دارد، در Taskbar ویندوز، نشان داده خواهد شد. دو خاصیت بعدی هم به ترتیب ارتفاع و عرض Window را مشخص می‌کند. به طور کلی در اسناد XAML، به دو صورت می‌توانید خواص یک عنصر را مشخص کنید. روش اول، اضافه کردن خواص عناصر در تگ آغازین کنترل مربوطه می‌باشد. معمولاً زمانی از این روش استفاده می‌کنیم که بتوان مقادیر خواص را به راحتی تنظیم کرد. به عنوان مثال به کد زیر توجه کنید:

<Window Title="MainWindow" Height="450" Width="800">

کد فوق، یک نمونه از آبجکت Window تعریف می‌کند و تعدادی خواص آن را از جمله عنوان، عرض و ارتفاع را مشخص می‌کند (نگران کدهای نوشته شده نباشید، به زودی معنای تمامی آن‌ها را متوجه خواهید شد). روش دوم، اضافه کردن خواص کنترل به صورت تگ‌های داخلی، و بین تگ آغازین و پایانی کنترل مورد نظر می‌باشد. به عنوان مثال می‌توان قطعه کد فوق را به صورت زیر نوشت:

<Window.Title>
    MainWindow
</Window.Title>
    
<Window.Width>
    800
</Window.Width>

<Window.Height>
    450
</Window.Height>

منبع : سایت barnamenevis.org