نام کاربری :   
کلمه عبور :   
[فراموشی رمز توسط ایمیل]
صفحه اصلی > دانش و فناوری > علوم کاربردی 


  چاپ        ارسال به دوست

آموزش جامع XAML قسمت اول

 

این مقاله ویژگی های زبان XAML را توضیح و نشان می دهد چگونه می توان از آن برای نوشتن برنامه های Windows Presentation Foundation یا (WPF) استفاده کرد.

XAML چیست؟

XAML، یک زبان نشانه دار تعریفی (declarative markup language) است. این زبان، همانگونه که به مدل برنامه نویسی .NET Framework اعمال شده است، ایجاد user interface برای برنامه .NET Framework را ساده می کند. می توان عنصرهای UI قابل رویتی در مارک آپ تعریفی XAML ایجاد کرد، و سپس با استفاده از فایل های پشت کد، که از طریق تعاریف کلاس جزیی به مارک آپ ملحق شده اند، تعریف UI را از منطق زمان اجرا جدا کرد. این زبان بطور مستقیم فرایند ایجاد اشیا در مجموعه ای معین از تایپ های پشتیبان تعریف شده در اسمبلی ها ارائه می کند. این کار برعکس اکثر زبان های مارک آپ است، که معمولاً زبانی تعبیر شده و بدون چنین رابطه مستقیمی با سیستم تایپ پشتیبان هستند. XAML، یک جریان کاری (workflow) را که بخش های مستقل می توانند روی UI ومنطق برنامه، با استفاده از ابزارهای مختلف کار می کنند، فعال می کند.

فایل های XAML، وقتی بصورت متن ارائه می شوند، فایل هایی هستند که معمولاً دارای اکتنشن .xaml هستند. این فایل ها را می توان توسط هر انکدینگ XAMLیی کدگذاری (encode) کرد. اما انکدینگ UTF-8 رایج ترین است.

مثال زیر چگونگی ایجاد یک دکمه بعنوان یک UI را نشان می دهد. هدف این مثال تنها این است که نشان دهد XAML چگونه استعاره های (metaphor) رایج برنامه نویسی UI را نمایش می دهد.

<StackPanel>
<Button Content="Click Me"/>
</StackPanel>

خلاصه ای از سینتکس XAML

ابن بخش، فرم های پایه ای سینتکس XAML را توضیح می دهد، و مثالی کوتاه از markup می آورد. هدف این بخش، در اختیار گذاشتن اطلاعات کاملی در مورد هر فرم سینتکس، از قبیل چگونگی نمایش این فرم ها در سیستم تایپ پشتیبان نیست.

اگر شما آشنایی قبلی با XAML داشته باشید، اغلب موضوعات بخش های بعدی، برای شما مبتدی خواهد بود. این موضوع نتیجه یکی از اصول اولیه طراحی XAML است. این زبان مفاهیم خودش را تعریف می کند، اما این مفاهیم در زبان XAML و فرم مارک آپ کارایی دارند.

عنصرهای شی

معمولاً عنصر شی نمونه ای (instanceS) از یک type را تعریف می کند. این type در اسمبلی هایی که تایپ های پشتیبان را برای تکنولوژی ای که از XAML بعنوان زبان استفاده می کنند، تعریف می شود.

سینتکس عنصر شی همیشه با علامت < شروع می شود. و به دنبالش نام تایپی می آید که می خواهید در یک نمونه (instance) ایجاد کنید (این نام می تواند حاوی یک پیشوند باشد، پیشوند مفهومی است که بعداً توضیح داده خواهد شد). بعد از این، می توانید بصورت اختیاری اتریبیوت هایی در مورد عنصر شی تعریف کنید. برای تکمیل تگ عنصر شی، در آخرش علامت > بگذارید. در عوض می توانید از یک فرم که خودش بسته می شود و دارای هیچ محتوایی نیست استفاده کنید و این کار را می توانید باوسیله تگی با forward slash و علامت /> در ادامه اش انجام دهید. مثلاً نگاهی دوباره به مارک آپ مثال قبلی بیاندازید.

این مثال دو عنصر شی را معین می کند: <StackPanel> ( با content، و سپس تگ انتهایی)؛ و <Button .../>

( فرمی که خودش بسته می شود، با چندین اتریبیوت). عنصرهای شی StackPanel و Button هر کدام با نام کلاسی که توسط WPF و بخشی از اسمبلی های WPF تعریف شده اند، مساوی می شوند. وقتی یک تگ عنصر شی تعیین می کنید، در واقع دستورالعملی برای پردازش XAML ایجاد می کنید تا نمونه ای جدید ایجاد کنید. هر نمونه توسط فراخوانی constructor پیش فرض، هنگام parse یا load کردن تایپ اصلی ایجاد می شود.

سینتکس اتریبیوت (پراپرتی ها)

پراپرتی های شی را می توان بصورت اتریبیوت های عنصر شی تعریف کرد. اتریبیوت سینتکس، پراپرتی ای را که در اتریبیوت سینتکس، که متعاقبش علامت = می آید، تنظیم شده است، نامگذاری می کند. مقدار اتریبیوت همیشه بصورت رشته ای تعیین می شود که حاوی علامت نقل قول "" هست.

اتریبیوت سینتکس، موثرترین سینتکس تنظیمات پراپرتی است و بهترین سینتکس برای استفاده برنامه نویسانی است که در گذشته از زبان های مارک آپ استفاده کرده اند. مثلاً مارک آپ زیر دکمه ای ایجاد می کند که دارای متن قرمز و پیش زمینه آبی است که متنی که بصورت Content تعیین شده را نیز نمایش می دهد.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

 

سینتکس عنصر پراپرتی (Property Element Syntax)

اتریبیوت سینتکس برای بعضی از پراپرتی های عنصر شی قابل اعمال نیست، زیرا شی یا اطلاعات لازم برای در اختیار گذاشتن مقدار (value) را نمی توان درون علامت نقل قول و محدودیت های رشته سینتکس اتریبیوت بیان کرد. در چنین مواردی، می توان از سینتکسی که property element syntax شناخته م شود استفاده کرد.

سینتکس تگ شروع عنصر پراپرتی (property element start) عبارت است از: <typeName.propertyName>. معمولاً محتوای این تگ عنصر شی تایپی هست که پراپرتی بعنوان مقدار (value) درنظر می گیرد. بعد از تعیین محتوا، باید عنصر پراپرتی را با یک end tag تمام کنید. سینتکس end tag، عبارت است از: </typeName.propertyName>.

اگر اتریبیوت سینتکس قابل اعمال باشد، معمولا، استفاده از آن راحت تر است و مارک آپ های فشرده تر را ساپورت می کند. مثال زیر، همان پراپرتی هایی را نشان می دهد که در مثال اتریبیوت سینتکس قبلی تنظیم شده اند، اما این بار با استفاده از property element syntax پراپرتی Button تنظیم شده اند.

<Button>
<Button.Background>
<SolidColorBrush Color="Blue"/>
</Button.Background>
<Button.Foreground>
<SolidColorBrush Color="Red"/>
</Button.Foreground>
<Button.Content>
This is a button
</Button.Content>
</Button>

 

سینتکس Collection

زبان XAML حاوی بهینه سازی هایی است که مارک آپ های قابل خواندنی تری تولید می کنند. یکی از این بهینه سازی ها این است که اگر پراپرتی مشخصی، تایپ کالکشنی را بگیرد، آنگاه آیتم هایی که در مارک آپ بصورت عنصرهای child در مقدار آن پراپرتی تعریف می شوند، بخشی از آن کالکشن می شوند. در این مورد، کالکشن عنصر شی child، مقداری است که در پراپرتی کالکشن تنظیم می شود.

مثال زیر، سینتکس کالکشن تنظیم مقادیر پراپرتی GradientStops را نشان میدهند:

<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<! no explicit new GradientStopCollection, parser knows how to find or create >
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>

 

پراپرتی های XAML Content

XAML، ویژگی زبانی را تعریف می کند که یک کلاس توسط آن می تواند یکی از پراپرتی هایش را به پراپرتی XAML content تخصیص دهد. عنصرهای child آن عنصر شی، جهت تنظیم مقدار آن پراپرتی content، مورد استفاده قرار می گیرد. بعبارت دیگر، برای پراپرتی content می توانید هنگان تنظیم آن پراپرتی در مارک آپ XAML، یک عنصر پراپرتی را حذف کنید و یک استعاره parent/child در مارک آپ تولید کنید.

مثلاً، Border، پراپرتی کانتنت Child را تعیین می کند. با دو عنصر Border زیر بطور یکسان رفتار می شود. اولی از مزایای content property syntax بهره می برد و عنصر پراپرتی Border.Child را حذف می کند. دومی Border.Child را بدون واسطه نشان می دهد.

<Border>
<TextBox Width="300"/>
</Border>
<!explicit equivalent>
<Border>
<Border.Child>
<TextBox Width="300"/>
</Border.Child>
</Border>

 

مقدار XAML content property، بعنوان قانونی در زبان XAML، باید یا کلاً قبل یا کلاً بعد از هر عنصر پراپرتی دیگری روی همان عنصر شی داده شود. مثلاً مارک آپ زیر compile نمی شود:

<Button>I am a 
<Button.Background>Blue</Button.Background>
blue button</Button>

 

محتوی متنی (Text Content)

تعداد کمی از عناصر XAML می توانند بطور مستقیم متن را درون محتوایشان پردازش کنند. بمنظور فعال سازی این کار، یکی از موارد زیر باید true باشد:

  • کلاس باید یک content property تعریف کند، و آن content property باید تایپی قابل تخصیص به رشته (string) باشد (این تایپ می تواند Object باشد). مثلاً، هر ContentControl از Content بعنوان content property و تایپ Objectاش استفاد می کند.
  • تایپ باید یک تبدیل کننده تایپ تعریف کند، که در این مورد، از محتوای متنی بعنوان متن آغازی برای آن تبدیل کننده تایپ استفاده می شود. مثلاً <Brush>Blue</Brush>. این کلاس عملاً کمتر رایج است.
  • تایپ باید یک primitive شناخته شده زبان XAML باشد.
Content Properties و Collection Syntax ترکیب شده

مثال زیر را در نظر بگیرید:

<StackPanel>
<Button>First Button</Button>
<Button>Second Button</Button>
</StackPanel>

 

در اینجا، هر Button، عنصر child در StackPanel است. این مارک آپی موثر است که دو تگ زیر را به دو دلیل متفاوت حذف می کند.

Omitted StackPanel.Children property element: StackPanel از Panel مشتق می شود. Panel، Panel.Children را بعنوان پراپرتی XAML contentاش تعریف می کند.

: Omitted UIElementCollection object element پراپرتی Panel.Children، تایپ UIElementCollection را می گیرد که را پیاده سازی می کند. بر اساس قوانین XAML، تگ عنصر کالکشن را می توان برای پردازش کالکشن هایی از قبیل IList حذف کرد. (در این مورد، UIElementCollection عملاً نمی توان instantiate کرد زیرا constructor پیش فرض را expose نمی کند. بهمین دلیل است که عنصر شی UIElementCollection بصورت commented out نشان داده می شود.

 

<StackPanel>
<StackPanel.Children>
<!<UIElementCollection>>
<Button>First Button</Button>
<Button>Second Button</Button>
<!</UIElementCollection>>
</StackPanel.Children>
</StackPanel>

سینتکس اتریبیوت (رویدادها (Events))

سینتکس اتریبیوت را می توان برای اعضایی که رویداد (event)محسوب می شوند و نه پراپرتی، نیز استفاده کرد. در این مورد، نام اتریبیوت همان نام رویداد است. در پیاده سازی WPF از رویدادهای XAML، مقدار اتریبیوت، نام یک handler است که delegate رویداد را پیاده سازی می کند. مثلاً، مارک آپ زیر، یک هندلر برای رویداد Click به یک Button مه در مارک آپ ایجاد شده، تخصیص می دهد.

<Page 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ExampleNamespace.ExamplePage">
<Button Click="Button_Click" >Click Me!</Button>
</Page>

مطالب بیشتری در مورد eventها و XAML در WPF وجود دارد. مثلاً شاید فکر کنید آنچه که ClickHandler در اینجا reference می کند، چگونه نمایش داده و تعریف می شود. این موضوع در بخش های بعدی مقاله مورد بحث قرار خواهد گرفت.

Case و Whitespace در XAML

XAML، معمولاً به حروف بزرگ و گوچک حساس است. است. بمنظور resolve کردن تایپ های پشتیبان، همان قوانینی که CLR را بحروف بزرگ و کوچک حساس می کنند، WPF XAML را نیز حساس می کنند. عنصرهای شی، عنصرهای پراپرتی، و نام های اتریبیوت همگی باید با استفاده از sensitive casing،هنگام مقایسه براساس نام با تایپ اصلی در اسمبلی، یا با عضوی از یک تایپ، تعیین شوند. کلیدواژه ها و primitiveهای زبان XAML نیز به حروف کوچک و بزرگ حساس هستند valueها همیشه حساس نیستند. حساسیت در valueها، بستگی به رفتار تبدیل کننده تایپ دارد که با پراپرتی ای که value آنرا می گیرد در ارتباط است. بعنوان مثال، پراپرتی هایی که تایپ Boolean را می گیرند، می توانند مقادیر معادل true یا false را بگیرند، فقط به این دلیل که پارسر WPF برای XAML مبدل نوع داده ای رشته ای به Boolean، قبلاً اینها را بصورت معادل هایی مجاز کرده است.

پردازشگرها و serialize کننده های WPF XAML کل فضای خالی های غیر مهم را نادیده می گیرند، و هر فضای خالی مهم را نرمال می کنند. این، با رفتار پیش فرض XAML در برخورد با فضاهای خالی سازگار است. این رفتار معمولاً فقط هنگامی که رشته ها را درون پراپرتی content تعیین می کنیم، اهمیت و تاثیر دارد. به عبارتی ساده تر، XAML، فضا، linefeed، و کارکترهای تب را به فضاها تبدیل می کند، و سپس در صورتی که در انتهای هر رشته مجاور به هم فضایی پیدا کند، آنرا حفظ می کند.


برگرفته شده از سایت تحلیل داده


٢٣:١٦ - 1390/12/28    /    شماره : ٧٣١    /    تعداد نمایش : ٨٣٧



خروج





   مطالب مرتبط
بازدیدها
امروز :12839
کل بازديدها :17168652
بازديدکنندگان آنلاين :30
بازديدازاین صفحه :179297