دوستان ما رو به اشتراک بزارید تا تمام دوستان از اینترنت آزاد استفاده کنند. نظرات فراموش نشه. لطفا خوراک خبری (RSS 2.0) ما رو به لیست علاقه مندی های خود اضافه کنید تا از آخرین اخبار سایت با خبر بشید.
|
آی پی آدرس |
نوع |
پورت |
|
61.186.166.2 |
HTTPS |
443 |
|
61.186.166.5 |
443 |
|
|
202.191.57.37 |
HTTPS |
443 |
|
221.232.247.27 |
HTTPS |
443 |
|
199.201.121.12 |
HTTPS |
443 |
|
109.86.203.184 |
HTTPS |
54321 |
|
109.86.201.180 |
HTTPS |
54321 |
|
93.79.133.235 |
HTTPS |
3128 |
|
79.135.239.18 |
HTTPS |
3128 |
|
195.182.141.42 |
HTTPS |
3128 |
|
212.3.153.25 |
HTTPS |
3128 |
برچسبها: فیلترشکن پروکسی ساکس رایگان آپدیت روزانه
Password: 5235hjubch
Username: EAV-44705528
Password: m5ctvh8c5j
Username: EAV-44706456
Password: xa548xpnca
Username: EAV-32384711
Password: ekxhbxfemx
Username: EAV-44705467
Password: dm54crfue4
Username: EAV-44705533
Password: rtsxjsu5m4
Username: EAV-44706454
Password: 8vnpacpavd
Username: EAV-44748549
Password: sjd8u7bchx
Username: EAV-44748649
Password: uvak4b4baj
Username: EAV-44748670
Password: 87djmxkv6e
Username: EAV-44749535
Password: c35cbrb3jh
Username: EAV-44749537
Password: jn586kkrjc
Username:
TRIAL-44642294
Password: ubsth6s68c
Username: TRIAL-44642893
Password: ntc7fh8442
Username: TRIAL-44642910
Password: fa748jds7k
Username: TRIAL-44642990
Password: pnj3pa3ena
Username: TRIAL-44643243
Password: snkptp2pv2
Username: TRIAL-44643360
Password: ca6tt4264r
Username: TRIAL-45110088
Password: 4avn22vant
Username: TRIAL-45239474
Password: d57kd5br45
Username: TRIAL-45239478
Password: b5mt7hkujt
Username: TRIAL-45239485
Password: mh4tmmjc57
Username: TRIAL-45239491
Password: r7hxau66mr
Username: TRIAL-45239494
Password: b8fmsd4apa
Username: TRIAL-45239499
Password: mkvm8f3ram
Username: TRIAL-45239508
Password: a6ksncxfjf
Password:excabh66d8
Username:EAV-44024250
Password:mkc66cfud4
Username:EAV-44155995
Password:4vsfssem3n
Username:EAV-44156040
Password:v6ehkc3ma2
مقدمه
کنترل گريد يکي از قوي ترين و پرکاربرد ترين کنترل هاي کانتينر مي باشد. به طور حتم مي توان گفت که در بيش از 90 درصد موارد، شما از اين کنترل براي طراحي واسط کاربري برنامه هاي خود استفاده خواهيد کرد. اين کنترل داراي خواص زيادي مي باشد که شما را در طراحي واسط هاي کاربري پيچيده ياري مي کند.
همانطور که تاکنون نيز شاهد بوده ايد، اين کنترل به صورت پيش فرض، کنترل کانتينر اصلي در هر پنجره اي قرار داده شده است که در مثال هاي قبلي ما ر حسي نياز آن را تغيير داده ايم و متناسب با نياز خود آن را تعريف کرده ايم.
مهمترين خواص کنترل گريد، خواص مربوط به تعاريف سطر و ستون آن مي باشد. با تعريف سطر ها وستون ها، مي توانيد مجموعه اي از سلول ها را در اين کنترل به وجود آوريد.
عناصري که بر روي اين کنترل قرار ميگيرند، هر يک مي توانند در يک سلول و يا بر حسب تعريفي که شما براي آن مشخص مي کنيد، در دو و يا بيش از دو سلول قرار گريد.
تعريف کنترل گريد در ساده ترين حالت، (تنها داراي يک سطر و يک ستون) به صورت زير مي باشد.
تعريف فوق که در ابتداي ايجاد هر پنجره جديدي،د رون کد XAML آن پنجره مشاهده مي کنيد، يک کنترل گريد داراي يک سطر و ستون براي شما ايجاد مي کند. همانطور که قبلا نيز اشاره شد، اکثر کنترل ها در حالت پيش فرض، داراي خواص HorizontalAlignment و VerticalAlignment هستند که به صورت پيش فرض داراي مقدار Stretch مي باشند. با توجه به اين نکته چنانچه شما يک دکمه مانند Button را به توسط دستور زير :
به کنترل گريد تعريف شده در کد قبل اضافه کنيد، کل فضاي گريد به کنترل Sample Button تعلق خواهد گرفت.
اين موضوع به اين دليل است که کنترل گريد سعي در اختصاص دادن کل فضاي موجود به کنترل هاي دروني آن مي باشد و نيز کنترل Button همانطور که گفته شد، داراي خواص HorizontalAlignment و VerticalAlignment با مقدار Stretch مي باشد که باعث مي شود، از حداکثر فضاي موجود بر روي کنترل والد خويش که به آن اختصاص داده شده است استفاده نمايد. کد زير همراه با شکل نشان دهنده مطالب گفته شده مي باشد.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300">

همانطور که در شکل فوق مشاهده مي شود، کنترل Button کل فضاي موجد گريد و در نتيجه کل فضاي پنجره را در اختيار گرفته است. ( زيرا کنترل گريد نيز کل فضاي پنجره را در اختيار گرفته است)
سطر ها وستون ها در کنترل گريد
از شکل فوق، مي توان نتيجه گرفت که کنترل گريد به آن صورتي که مطرح شد، داراي کارايي بالايي نمي باشد. زماني اين کنترل مي تواند به طور موثر و کارا در توليد واسط هاي کاربري شما موثر واقع شود که بتوانيد براي آن سطر ها و ستون هاي دلخواه خود را تعريف کنيد و از آن ها به صورت موثر و دلخواه استفاده نماييد. با تعريف سطر ها و ستون ها براي کنترل گريد، مي توانيد آن را به تعداد سلول دلخواه خود تقسيم کرده و کنترل هاي مورد نظر خود را درون آن سلول ها قرار دهيد.
هر کنترلي مي توانيد درون يک يا چند سلول قرار بگيرد و هر سلول با استفاده از کنترل هاي کانتينر مي تواند شامل يک يا چند کنترل باشد. در قسمت قبلي و در زماني که کنترل UniformGrid را توضيح مي دادم، اشاره شکردم که در آن کنترل نمي توانيد بر محل قرار گيري کنترل هاي فرزند، نظارت داشته باشيد و سلول هاي دلخواه خود را به کنترل هاي دلخواه خود، نسبت دهيد.
در واقع اين کنترل UniformGrid است که براي شما تصميم مي گيريد و کنترل هاي شما را بر اساس ترتيب تعريف شده آ ن ها در سلول هاي خود قرار مي دهد.
اما در کنترل Grid همه چيز در اختيار شما خواهد بود. مي توانيد مشخص کنيد که کدام کنترل در چه سلولي قرار گيرد، نيز مشخص کنيد که يک کنترل تا چند سطر و ستون را مي تواند احاطه کند و امکانات ديگري که در قسمت هاي بعدي به آن ها اشاره خواهد شد.
قرار گيري کنترل ها در کنترل گريد
براي قرار دادن کنترل هاي خود در ون يک کنترل گريد، دو مرحله زير را بايستي انجام دهيد
1. مشخص کردن تعداد سطر ها و ستون هاي گريد
توسط خواصي که براي اين امر اختصاص داده شده است، مي توانيد تعداد سطر ها و ستون ها را در کنترل گريد خود مشخص کنيد.
2. مشخص کردن سطر و ستون دلخواه براي کنترل هاي فرزند
همانطور که قبلا نيز اشاره شد، هر کنترل فرزندي بر اساس نوع کنترل والد خويش، داراي خواص جديدي مي شود که آن ها را خواص پيوست شده ناميديم. اين امر براي کنترل هايي که کنترل گريد به عنوان کنترل والد آن ها مي باشد نيز مستثنا نمي باشد. دو خاصيت Row و Column از جمله خواص پيوست شده به کنترل هاي فرزند، کنترل گريد مي باشند که توسط آن ها مي توانيد محل قرار گيري کنترل فرزند را مشخص نماييد. به عنوا مثال، کنرلي که داراي مقدار Row = 2 و Column = 3 مي باشد، درون سطر دوم و ستون سوم از کنترل گريد قرار خواهد گرفت.
سطر ها در کنترل گريد
کنترل گريد داراي خاصيتي به نام RowDefinitions مي باشد که توسط آن مي توانيد تعداد سطر دلخواه براي کنترل گريد تعريف نماييد. به قطعه کد زير توجه فرماييد:
در شکل فوق، سه سطر براي کنترل گريد تعريف شده است. تعاريف سطر ها بين دو تگ آغازين
از ميان اين خواص، خواص Height، MaxHeight و MinHeight از اهميت بالاتري بر خوردار هستند. تعاريف مربوط به خواص MaxHeight و MinHeight در بخش هاي قبلي به تفضيل گفته شد. خاصيت Height داراي سه مقدار مختلف مي تواند باشد که کمي جلوتر در بخش "تعادل در اندازه سطر ها و ستون ها" توضيح داده خواهند شد.
ستون ها در کنترل گريد
کنترل گريد داراي خاصيتي به نام ColumnDefinitions مي باشد که توسط آن مي توانيد تعداد ستون هاي دلخواه براي کنترل گريد تعريف نماييد. به قطعه کد زير توجه فرماييد:
در شکل فوق، سه ستون براي کنترل گريد تعريف شده است. تعاريف ستون ها بين دو تگ آغازين
از ميان اين خواص، خواص Width، MaxWidth و MinWidth از اهميت بالاتري بر خوردار هستند. تعاريف مربوط به خواص MaxWidth و MinWidth در بخش هاي قبلي به تفضيل گفته شد. خاصيت Width داراي سه مقدار مختلف مي تواند باشد که کمي جلوتر در بخش "تعادل در اندازه سطر ها و ستون ها" به همراه تعريف مقادير Height براي سطر ها توضيح داده خواهند شد.
خاصيت ShowGridLines
کنترل گريد داراي خاصيتي به نام ShowGridLines مي باشد که مقدار پيش فرض آن False مي باشد. چنانچه اين مقدار را به True تغيير دهيد، مي توانيد خطوطي که سطر ها وستون هاي کنترل گريد را از يکديگر جدا مي کند را مشاهده نماييد. البته معمولا از اين خاصيت استفاده چنداني نمي شود مگر در موارد خاصي که شما نياز داشته باشيد، خط واصل بين سطر ها وستون ها را به کاربر نهايي نشان دهيد.
حال به قطعه کد زير که ترکيبي از دو قطعه کد فوق است توجه فرماييد:
xmlns="http :// schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300">
قطعه کد فوق، سه سطر و سه ستون براي کنترل گريد تعريف مي کند که در مجموع 9 سلول را براي اين کنترل به وجود مي آورند. نتيجه حاصل از قطعه کد فوق را در شکل زير مشاهده مي کنيد:

تعادل در اندازه سطر ها و ستون ها
همانطور که در شکل فوق مشخص است، فضاي موجود بر روي کنترل گريد، به صورت مساوي بين تمامي سطر ها وستون هاي اين کنترل تقسيم مي شود. در زمان اجراي برنامه و با تغيير سايز پنجره و به تبع آن تغيير سايز گريد، اين فضا همچنان به صورت اتوماتيک، به قسمت هاي مساوي بين سطر هاو ستون هاي کنترل گريد، تقسيم مي شود. در واقع در حالت عادي، کنترل گريد داراي رفتاري مشابه با کنترل UniformGrid مي باشد که در بخش قبلي در رابطه با آن توضيحات مفصلي داده شد.
همانطور که اشاره شد، سطر ها داراي خاصيتي به نام Height و ستون ها داراي خاصيتي به نام Width در کنترل گريد مي باشند. هر يک از اين دو خاصيت، مي توانند يکي از سه مقدار زير را در بر گيرند که با توجه به آن مقدار فضاي آن و رفتار آن با کنترل دروني خودش مشخص مي شود.
1. سايز مطلق
توسط اين خاصيت مي توانيد، مقدار مشخص و ثابتي را به عنوان عرض ستون و يا ارتفاع سطر مشخص کنيد. به عنوان مثال دستور
سطري را با ارتفاع ثابت 200 تعريف مي کند و دستور زير:
ستوني را با عرض ثابت 200 تعريف مي کند.
2. سايز اتوماتيک
اين خاصيت، عرض ستون و ارتفاع سطر را به صورت اتوماتيک و بر اساس نياز کنترل دروني خودش تنظيم ميکند. به عنوان مثال اگر کنترلي با داراي عرض 200 و ارتفاع 300 باشد و درون سلولي که سطر و ستون آن با اين روش مقدار دهي شده اند، قرارداشته باشد، سلول مورد نظر تغيير اندازه داده تا بتواند کل فضاي مورد نياز آن کنترل را تامين کنيد. مقداري که بايد به کار برده شود تا سطر و ستوني به عنوان سطر و ستون اتوماتيک معرفي گردد، کلمه Auto مي باشد. به کد هاي زير توجه کنيد:
در شکل فوق سطر و ستوني با ارتفاع اتوماتيک تعريف شده اند.
3. سايز نسبي
توسط اين خاصيت، فضاي موجود بين تعداي سطر و ستون تقسيم بندي مي شود. در واقع اين حالت، حالت پيش فرض براي عرض ستون ها و ارتفاع سطرها مي باشد. توسط کاراکتر * مي توانيد از اين خاصيت براي خواص Width و Height استفاده نماييد.
به عنوان مثال، کد هاي زير نتيجه اي يکسان با آن چيزي که در شکل قبلي ملاحظه کرديد را خواهد داشت.
نکته قابل توجه اي که مي توان در حالت سايز نسبلي به آن توجه داشت و به واقع دليل اصلي نام گذاري آن نيز، همين نکته مي باشد اين است که شما مي توانيد سطري يا ستوني را از لحاظ ارتفاع و عرض، چندين برابر سطر و يا ستون ديگري تعريف کنيد. به عنوان مثال سطري که خاصيت ارتفاع آن به صورت Height = 2* تعريف شده باشد، ارتفاعش دو برابر سطري است که ارتفاع آن به صورت Height = * تعريف شده باشد. به همين صورت سطري که ارتفاع آن به صورت Height=0.25* تعريف شده است، ارتفاعي به اندازه 1/8 سطري دارا که ارتفاع آن به صورت Height =2* تعريف شده است. اين موضوع در مورد ستون ها و عرض آن ها نيز صدق است.
تعيين سلول براي کنترل ها ي فرزند در کنترل گريد
قبلا اشاره شد که دليل اصلي اينکه کنترل گريد از قويترين و پرکاربرد ترين کنترل هاي کانتيتر مي باشد اين است که شما کنترل کاملي بر روي سطر ها وستون هاي گريد مي توانيد داشته باشيد. در اين قسمت به نحوه تخصيص يک سلول خاص در کنترل گريد را به يک کنترل مشخص نشان خواهم داد. براي تخصيص سلول خاصي از کنترل گريد به يکي از کنترل هاي فرزند از خواص پيوست شده Row و Column استفاده خواهيم کرد.
به نمونه کد زير دقت کنيد:
در قطعه کد فوق، دکمه تعريف شده در سطر و ستون سوم ( سلول 9) در گريد مربوطه قرار خواهيد گرفت.
نکته:
شماره سطر ها وستون ها در گريد از صفر شروع مي شود. بنابرين مقدار 2 براي سطر و ستون معرف سطر و ستون سوم در گريد مي باشد.
نکته:
چنانچه بخواهيد کنترلي را در سلول اول از گريد قرار دهيد، نياز به تنظيم خواص Row و Column از گريد نداريد. در واقع مقدار پيش فرض اين خواص، صفر مي باشد که بيانگر سطر و ستون اول گريد مي باشد.
براي درک بهتر به نمونه کر زير دقت کنيد:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> > > >
هماطور که مشاهده مي کنيد، براي اولين دکمه خواص Row و Column تنظيم نشده اند، در نتيجه دکمه مذکور در اولين سطر و ستون از گريد قرار خواهد گرفت.
نتيجه اجراي کد فوق مشابه زير خواهد بود:

محدوده سطر و ستون ها در کنترل گريد
در اين قسمت دو خاصيت ديگر از خواص پيوست شده براي کنترل هاي درون کنترل گريد را مورد بررسي قرار خواهيم داد. اين خواص نشان دهنده محدوده اي از تعداد سطر ها وستون هايي از گريد هستند که يک کنترل مي تواند دربر گيرد. توسط اين خواص مي توانيد کنترل بهتري بر روي عناصر و محل قرار گيري آن ها داشته باشيد.
خاصيت RowSpan
توسط اين خاصيت مي توانيد مشخص کنيد که کنترلي چند سطر از سطر هاي گريد را مي تواند در بر گيرد. به عنوان مثال قطعه کد زير:
در قطعه کد فوق، دکمه دوم داراي خاصيت RowSpan برابر با سه مي باشد. همچنين دقت کنيد که خاصيت Row آن از يک در مثال قبل به صفر در اين مثال تغيير کرده است.
نتيجه حاصل از کد فوق را در شکل زير مشاهده مي کنيد

خاصيت ColumnSpan
توسط اين خاصيت مي توانيد مشخص کنيد که کنترلي چند ستون از ستون هاي گريد را مي تواند در بر گيرد. به عنوان مثال قطعه کد زير:
در قطعه کد فوق، دکمه دوم داراي خاصيت ColumnSpan برابر با سه مي باشد. همچنين دقت کنيد که خاصيت Column آن از يک در مثال قبل به صفر در اين مثال تغيير کرده است.
نتيجه حاصل از کد فوق را در شکل زير مشاهده مي کنيد:

نمونه کد زير نحوه استفاده از خواص RowSpan و ColumnSpan و نتيجه آن را در شکل بعد از آن نشاند مي دهد.
دقت کنيد که در اين نمونه، تعداد سطر ها وستون ها به چهار، افزايش پيدا کرده است. خاصيت RowSpan از دکمه دوم برابر با چهار و خاصيت ColumnSpan از آن برابر با دو تنظيم شده است.
کنترل گريد از مهمترين و پر کاربرد ترين کنترل هاي کانتينر در WPF مي باشد. پس تمرکز زيادي بر آن داشته باشيد و سعي کنيد که کاملا بر آن و نحوه استفاده از ان مسلط شويد.
| ||
|
مقدمه در بخش هاي قبلي، مقدماتي در مورد تکنولوژي WPF و زبان XAML که در اين تکنولوژي بسيار مورد استفاده قرار مي گيرد، صحبت کردم. در اين بخش و بخش هاي بعدي، نحوه استفاده از کنترل هاي Container را جهت چيدمان ساير کنترل ها بر روي پنجره ها مورد بررسي قرار خواهم داد. اما قبل از آن نگاهي گذرا به نحوه ايجاد يک برنامه WPF در محيط ويژوال استوديو 2008 خواهيم داشت. ايجاد برنامه هاي WPF نحوه ايجاد يک پروژه WPF دقيقا مانند نحوه ايجاد پروژه هاي WinApp مي باشد که قبلا نيز بسيار از آن استفاده کرده ايد. تنها ذکر چند نکته ضروري مي باشد که در ادامه خواهيم ديد. ابتدا براي ايجاد يک پروژه WPF بايستي به پنجره New Project برويد. اين پنجره را به روش ها مختلفي مي توانيد باز کنيد ( که حتما با آن ها آشنايي داريد). اين پنجره را در شکل زير مشاهده مي کنيد:
همانور که در شکل نشان داده شده است، دو قالب کلي براي ايجاد برنامه هاي WPF موجود مي باشد. اولين قالب گزينه WPF Application مي باشد. که موضوع اصلي ما نيز همين گزينه است. و ديگري گزينه WPF Browser Application مي باشد. در ادامه توضيحات مختصري در مورد هر يک از اين دو قالب برنامه نويسي WPF خواهم داد. نکته ديگري که در ويژوال استوديو 2008 قابل توجه است، اين است که شما مي توانيد نسخه دات نت فريم ورک خود را انتخاب کنيد، و برنامه خود را بر طبق آن نسخه پياده سازي کنيد. ( به اين قابليت اصطلاحا Multi targeting ) مي گويند. قالب WPF Application اين مدل از برنامه نويسي WPF ، شباهت بسيار زيادي با مدل برنامه نويسي WinApp دارد. در عين حال نيز تفاوت هاي بسياري با آن نيز دارد که مهمترين تفاوت بين آن ها، کنترلي است که به عنوان پدر تمامي کنترل هاي ديگر شناخته مي شود. در برنامه نويسي WinApp تمامي کنترل هاي بايستي، بر روي آبجکتي از کلاسي به نام Form قرار بگيرند. در حالي که در WPF اين کنترل، آبجکتي از کلاس Window مي باشد. زماني که يک پروژه WPF Application ايجاد مي کنيد، يک آبجکت از کلاس Window ساخته مي شود که به صورت پيش فرض نام آن Window1 مي باشد. هر کلاس Window داراي دو حالت قسمت مجزا مي باشد. قسمتي مربوط به کد نويسي و ايجاد منطق هاي برنامه شما، و قسمت ديگر مربوط به Design برنامه مي باشد، که در اين قسمت دستورات XAML را مي توانيد مشاهده کنيد و اقدام به طراحي برنامه خود نماييد. شکل زير نتيجه حاصل از ايجاد يک پروژه WPF Application را نشان مي دهد.
همانطور که مشاهده مي شود، يک Window به وجود امده است. بخش هاي مختلف روي عکس مشخص شده است. تغييراتي در دو پنجره Toolbox و Properties به وجود امده است که با مشاهده آن، خودتان متوجه تغييرا تخواهيد شد. نکته اي که مهم است اين است که در بيش از 90 درصد زمان کار با پروژه خودتان، به سراغ پنجره هاي Toolbox و Properties نخواهيد رفت. ( در دات نت 2.0 تقريبا عکس اين موضوع بود) اين موضوع به اين دليل است که تقريبا تمامي کارها در پروژه شما با نوشتن دستورات و کد ها در قسمت XAML صورت مي گيرد. از ايجاد آبجکت ها، تنظيم خواص، رويداد ها و .... ( البته در بعضي موراد هم استفاده از پنجره Properties باعث صرفه جويي در وقت خواهد شد). قالب WPF Browser Application اين قالب که يک جنبه جديدي از برنامه نويسي را پيش روي شما قرار مي دهد، شباهت زيادي به برنامه هاي تحت وب دارد. بزرگترين تفاوت آن با مدل WPF Application اين است، که در اين حالت کنترل مادر، به جاي Window ، آبجکتي است که از کلاس Page ارث بري مي کند. اين نوع برنامه ها، مستقيما توسط مرورگرهاي وب از جمله IE و Fire Fox قابل اجرا شدن هستند. البته محدوديت هايي در به کار گيري جنبه هايي از WPF در اين مدل، وجود دارد. به عنوان مثال بسياري از افکت هاي گرافيکي را نمي توان در اين روش به کار برد. توصيه: هميشه در هنگام ايجاد پروژه ها، نسخه 3.5 از دات نت فريم ورک را انتخاب کنيد. به دليل اينکه WPF 3.5 از لحاظ کارايي نسبت به WPF 3.0 بهتر شده است. نکته: همچنان مي توانيد در برنامه هاي WPF از فرم هاي ويندوزي سابق نيز استفاده کنيد. کلاس APP: کلاس ديگري که هر پروژه WPF حتما يک نمونه از آن را دارا مي باشد، کلاس APP مي باشد که از کلاس Application ارث بري مي کند. اين کلاس نيز داراي بخشي کد به صورت XAML مي باشد که در زير مشاهده مي کنيد: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Window1.xaml"> همانطور که مي بينيد، آبجکتي از کلاس Application ايجاد شده است که کلاس App را به عنوان کلاسي که کد هاي آن در آن جا قرار دارد، معرفي کرده است. دو آيتمي که در کد فوق جديد هستند عبارتند از خاصيت StartupUri و تگ Resources . خاصيت StartupUri ، نام کلاسي را مشخص مي کند که به عنوان اولين پنجره برنامه يا همان پنجره اصلي برنامه نمايش داده خواهد شد. اگر بخواهيم، تناسبي بين اين کلاس و کلاسي در دات نت فريم ورک 2.0 ايجاد کنيم، مي توان گفت که کلاس Application در WPF عملکردي مانند کلاس Program در برنامه هاي WinApp دارد. همچنين دستور StartupUri چيزي شبيه به دستور Application.Run در کلاس Program مي باشد. چيدمان عناصر در WPF در بخش قبلي، با مقدمات محيط طراحي و کد نويسي ويژوال استوديو 2008 آشنا شديد. در اين بخش به کنترل هاي کانتينر ( کنترل هايي که مي توانند کنترل هاي ديگر، شامل همه کنترل هاي ويژوال و نيز کنترل هاي کانتينر ديگر را در برگيرند) مي پردازيم. کنترل هاي کانتير اساس برنامه نويسي در WPF محسوب مي شوند. اين کنترل ها، امکانت متعددي را در اختيار شما قرار مي دهند که بتوانيد کنترل هاي خود را به صورت صحيح بر روي فرم خود قراردهيد. فلسفه چيدمان و قالب بندي در WPF در دات نت فريم ورک 1.x (1.0 و 1.1) ، دو خاصيتي که در چيدمان عناصر بر روي فرم ها، موثر بودند، خواص Anchor و Dock بودند. توسط اين دو خاصيت مي توانستيد، کنترل ها را بر روي فرم خود، چنان تنظيم کنيد، که در صورت تغيير سايز فرم، کنترل ها نيز به تناسب ان تغيير سايز بدهند و يا محل قرار گيري آ نها به صورت پويا تغيير کنيد. اما باز هم اين خواص جواب گوي نياز هاي شما به صورت کامل نبودند. به ويژوه زماني که کنترل هاي خود را به صورت پويا و در زمان اجراي برنامه ايجاد مي کرديد، اين مسئله بيشتر باعث عذاب و رنجش بود. به صورتي که گاها نياز به کد نويسي هاي بسياري براي چيدمان کنترل ها بر روي فرم بود. دردات نت فريم ورک 2.0 عناصر ديگري اضافه شدند که مي توانستند، چيدمان عناصر را تا حدي، کنترل نمايند. يکي از اين کنترل ها، کنترل FlowLayoutPanel بود (است). امااين کنترل ها نيز قابليت ها و کارايي بسيار خوبي را مهيا نمي کردند. ودليل ديگر آن اين بود که اين کنترل ها به صورت يک افزونه وارد دات نت 2.0 شده بودن و در واقع جزء هسته اصلي فرم هاي ويندوزي نيستند و به واقع يک افزونه براي آن ها به شمار مي آيند. مانند کنترل هاي بسياري که شرکت هاي ثالث نوشته اند و مي نويسند. علاوه بر اين، اساس اين کنترل ها نيز بر پايه مکان قرار گرفتن کنترل ها مي باشد که اين خود نيز به نوعي محدوديت محسوب مي شود. تکنولوژي WPF سيستم جديدي را از پايه براي شما فراهم مي کند که به شما اجازه ايجاد برنامه هايي را مي دهد که وابسته به سايز و يا رزولوشن صفحه نمايش نباشد. همانطور که قبلا نيز گفته شد، تعيين سايز و محل قرار گيري کنترل ها به صورت مشخص و ثابت، کارايي برنامه را به شدت کاهش مي دهد.( البته در مواردي اجتناب ناپذير است. به عنوان مثال زماني که از Canvas استفاده مي کنيد، ناچار هستيد که محل قرار گيري کنترل هاي روي آن را صراحتا تعيين کنيد) . چند نکته اصلي و مهم در پشت مفهوم فلسفه چيدمان و قالب بندي در WPF وجود دارد که تيتر وار بيان مي شوند: الف) سايز عناصر نبايستي صراحتا تعيين گردد ( تا جاي که امکان پذير باشد) ب) محل قرار گيري عناصر نبايد به صورت دستي نسبت به گوشه صفحه نمايش تعيين گردد( تا جايي که ممکن باشد) ج) کنترل هاي کانتينر، مي توانند به صورت داخلي قرار بگيرند.( هر کنترل کانتينر مي تواند شامل 0، 1 و يا بيش از يک کنترل کانتينر ديگر باشد) د) کل فضاي موجود يک کنترل کانتينر بين تمامي کنترل هاي دروني آن (Children Elements ) تقسيم بندي مي شود. اين تقسيم بندي بر اساس نياز هر کنترل به فضايي که نياز دارد تعيين مي گردد و مي تواند به صورت پويا تغيير کند. کنترل هاي کانتينر (Container Controls ) همانطور که قبلا نيز اشاره شد، تمامي کنترل هاي قالب بندي WPF از کنترل پايه اي به نام Panel ارث بري مي کنند. اين کنترل نيز طي ارث بري هايي به آبجکت Dispatcher Object ختم مي شود. که در زير توضيح مختصري در مورد هر يک داده شده است. و در ادامه به صورت مفصل به بررسي هريک از اين عناصر با ذکر مثتال هايي خواهم پرداخت . کنترل StackPanel : کنترل Canvas : کنترل DockPanel : کنترل WrapPanel : کنترل UniformGrid : کنترل Grid : کنترل StackPanel اين کنترل، عناصر داخل خودش را که در خاصيت Children اين کنترل قرار گرفته اند را بر اساس جهتي که شما مشخص مي کنيد ( افقي يا عمودي) به صورت پشته اي مرتب مي کند. نحوه تعريف StackPanel به صورت زير مي باشد:
به عنوان مثال کد زير، سه کنترل TextBox و يک کنترل Button بر روي StackPanel قرار مي دهد.
شکل حاصل از دستورات فوق، مشابه زير خواهد بود:
همانطور که اشاره شد، کنترل StackPanel قابليت چيدن عناصر را به صورتي افقي نيز دارا مي باشد. با به کار گيري خاصيت Orientation از اين کنترل مي توانيد، نحوه قرار گيري عناصر را مشخص سازيد. اين حاصيت داراي دو مقدار Horizontal و Vertical مي باشد. که به ترتيب براي تراز کردن عناصر به صورت افقي و عمودي بر روي StackPanel به کار مي رود.
در اين کد، خاصيت Orientation در تگ آغازين کنرل StackPanel بر روي Horizontal قرار گرفته است.
نکته: خواص تراز بندي دو خاصيت HorizontalAlignment و VerticalAlignment که در موارد متعددي استفاده مي گردند، محل قرار گيري افقي و عمودي کنترل را نسبت به کنترل کانتينر خودش مشخص مي کند. خاصيت HorizontalAlignment مقادرير خاصيت HorizontalAlignment عبارتند از : Left : اين مقدار، باعث مي شود که کنترل مورد نظر از سمت چپ کنترل پدرش تراز شود. عکس زير، موارد گفته شده را نشان مي دهد:
کدي که براي برنامه فوق نوشته شده است:
خاصيت VerticalAlignment اين خاصيت داراي چهار مقدار زير مي باشد : نکته: خاصيت Margin اين خاصيت، فاصله کنترل را از کنترل هاي اطراف خودش مشخص مي کند . اين خاصيت داراي چهار مقدار Left،Top،Bottom و Right مي باشد. با کد فوق، عنصري که براي آن خاصيت Margin مشخص شده است، از هر طرف به مقدار 5 واحد با کنترل هاي اطرافش فاصله خواهد دشت. نکته: دو قطعه کد فوق يکسان مي باشند. در واقع مي توانيد تنها با قرار دادن يک، هر چهار مقدار اين خاصيت را مقدار دهي کنيد. شکل زير، نمونه اي از نحوه استفاده از اين خاصيت را مشخص مي کند:
کد مربوط به شکل فوق: خواص سايز شش خاصيت زير براي تنظيم سايز کنترل ها به کار مي روند: خاصيت Width : اين خاصيت، عرض کنترل را به صورت صريح مشخص مي کند. خاصيت Height : اين خاصيت به صورت صريح، مقدار ارتفاع کنترل را مشخص مي کند. خاصيت MinHeight: اين خاصيت مينيمم ارتفاعي را که يک کنترل مي تواند اختيار کند را مشخص مي کند. خاصيت MinWidth: اين خاصيت مينيمم عرضي را که يک کنترل بايد داشته باشد را مشخص مي کند. خاصيت MaxHeight: اين خاصيت ماکزيمم ارتفاعي را که يک کنترل مي تواند اختيار کند را مشخص مي کند. خاصيت MaxWidth: اين خاصيت ماکزيمم عرضي را که يک کنترل بايد داشته باشد را مشخص مي کند. نکته: کنترل Canvas اين کنترل نيز يکي ديگر از کنترل هاي کانتينري مي باشد که عناصر مختلف مي توانند بر روي آن قرار بگيرند. از اين کنترل به ندرت در برنامه ها استفاده مي شود. به اين دليل که اين کنترل، عناصر داخلي خود را بر مبناي مکان آن عنصر که به صورت صريح در خواص آن عنصر ذکر گرديده است، تراز بندي مي کند. به همين دليل در مواقعي که امکان تغيير سايز پنجرها و مقادير عناصر در زمان اجراي برنامه باشد، استفاده از اين کنترل، انتخاب مناسبي نمي تواند باشد. قبلا اشاره شد که کنترل هايي که درون کنترل هاي کانتينر قرار مي گيرند، بسته به نوع کنترل کانتينر، خواص جديدي به مجوع خواص آن ها اضافه مي شود. کنترل Canvas نيز از اين امر مستثنا نيست. به نمونه کد زير دقت کنيد:
همانطور که مي بينيد، مکان هر کنترلي درون کنترل Canvas با خواص پيوست شده ي Left، Top، Right و Bottom مشخص شده است. شکل نهايي حاصل از اجراي اين کد به صورت زير خواهد بود:
نکته: به عنوام مثال اگر کاربر در دو TextBox بالايي مقادير 10 و 20000 را وارد کند، TextBox ها تغيير اندازه داده و به شکل زير در خواهند آمد:
همچنين اگر مقادير TextBox ها بيش از عرض فعلي آن ها باشد، عرض TextBox ها زياد شده تا بتواند تمامي مقادير را در خود جاي دهد. در کد زير، که با تغير در کد قبلي به وجود امده است، TextBox بالايي، در اندازه 120 ثابت شده است. اين به اين معني است که با تغيير محتويات داخل TextBox طول TextBox ثابت مي ماند.
نتيجه اجراي حاصل از کد فوق به صورت زير خواهد بود:
همانطور که در شکل فوق مشاهده مي کنيد، تکست باکس بالايي با تغيير مقدار آن به 10 ، تغييري در شول آن صورت نگرفته است. خاصيت ZIndex توسط اين خاصيت مي توانيد نحوه چيدمان عناصري را که بر روي هم قرار گرفته اند را مشخص کنيد. هر کنترلي که مقدار ZIndex آن بزگتر باشد، بر روي کنترل هايي که مقدار ZIndex آن ها کوچکتر است قرار خواهد گرفت. به نمونه کد زير دقت کنيد:
در اين کد که شامل يک کنترل Canvas و چهار کنترل Button بر روي آن مي باشد، دکمه ها داراي خاصيت ZIndex مي باشند. نتيجه اجراي کد فوق رادر شکل زير مشاهده مي کنيد.
همانطور که در شکل فوق نيز مشخص است، دکمه اي که با رنگ زرد مشخص شده است، به دليل اينکه داراي مقدار ZIndex با لاتري نسبت به دکمه هاي ديگر دارد، بر روي تمامي دکمه ها قرار گرفته است. دکمه آبي رنگ داراي مقدار ZIndex برابر با 2 مي باشد. به عمين دليل، قسمتي از آن بالاتر از دکمه قرمز رنگ قرار گرفته است ( چون دکمه قرمز رنگ مقدار ZIndex کتري نسبت به دکمه آبي رنگ دارد) و قسمتي از آن زير دکمه زرد رنگ قرار گرفته است.( به اين دليل که دکمه زرد رنگ داراي خاصيت ZIndex بالاتري نسبت به دکمه آبي رنگ دارد) کنترل DockPanel در دات نت 1.x و 2.0 با خاصيتي به نام Dock آشنا شديد. اين خاصيت براي هر کنترلي که تنظيم مي شد ( مي شود)، با عث مي شد (مي شود) که کنترل مورد نظر بر اساس مقداري که براي خاصيت Dock آن تنظيم شد است، به يکي از گوشه هاي کنترل پدر خودش وصل شود. به عنوان مثال اگر کنترلي داراي مقدار Top براي خاصيت Dock باشد، واين کنترل مستقيما بر روي فرم قرار گرفته باشد، اين کنترل به گوشه بالايي فرم متصل مي شود. در نتيجه با تغيير عرض فرم، اين کنترل به صورت اتوماتيک نيز تغيير سايز مي دهد و عرض خودش را با عرض فرم مجددا تنظيم مي کند.از اين خاصيت در برنامه ها، زياد استفاده مي شود، به عنوان مثال کنترل Status Bar که معمولا در پايين فرم، Dock مي شود، ويا منوي برنامه که در گوشه بالايي فرم Dock مي شود از اين نمونه هستند. کنترل DockPanel نيز عملکري مشابه با عملکر خاصيت Dock دارد. با اين تفاوت که قدرت بسيار بالاتر و امکانات بسيار بيشتري را در اختيار شما قرار مي دهد. هر کنترلي که در کنترل DockPanel قرار بگيرد، خاصيتي به نام Dock به آن پيوست خواهد شد. اين خاصيت داراي چهار مقدار Left، Top، Bottom و Right مي باشد. توسط اين مقادير مي توانيد کنترل هاي خود را در کنترل DockPanel تنظيم نماييد. به نمونه کد زير دقت کنيد: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DockPanelContainer" Height="300" Width="300">
در بالاترين، سطح از اين کنترل ها، کنترل DockPanel قرار گرفته است. پنج کنترل ديگر به عنوان فرزندان مستقيم کنترل DockPanel قرار گرفته اند که بعضي از اين کنترل ها، خود نيز شامل چندين کنترل ديگر مي باشند. تمامي کنترل هاي فرزندف داراي خاصيت پيوست شده Dock مي باشند. به عنوان مثال قطعه کد زير: دکمه اي را به عنوان فرزند کنترل DockPanel تعريف مي کند که در سمت راست خودش قرار گرفته است. دستور DockPanel.Dock="Right" باعث مي شود که کنترل، به گوشه سمت راست کنترل DockPanel قرار گيرد. نتيجه حاص از اجراي کد فوق در شکل زير مشخص شده است:
ترتيب در Dock کردن کنترل ها: ترتيب تنظيم خاصيت Dock مربوط به کنترل ها در کنترل DockPanel مهم مي باشد. به عنوان مثال دو قعطه کد زير را نظر بگيريد: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> شکل حاصل از اجراي قطعه کد فوق مشابه زير خواهد بود:
در کد فوق، دکمه اي که با رنگ سبز مشخص شده است، به دليل اينکه قبل از دکمه آبي رنگ تعريف شده است، کل فضاي گوشه بالايي را به خود اختصاص داده است. حال اگر جاي تعريف اين دو دکمه (button1 و button2) را در کد عوض کنيم، يعني داشته باشيم: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> نتيجه حاصل مشابه زير خواهد بود:
مقدار Fill در خاصيت Dock خاصيت Dock از کنترل DockPanel داراي مقدار Fill نمي باشد. در واقع به آن نياز ندارد. دليل اين امر به نحوه چيدمان کنترل ها در کنترل DockPanel مربوط مي شود. کنترل DockPanel همواره سعي بر دادن کل فضاي موجود به کنترل هاي فرزند خودش مي باشد. به عنوان مثال اگر کنترل DockPanel فقط داراي يک کنترل Button باشد، اين دکمه کل فضاي موجود بر روي کنترل DockPanel را به خود اختصاص مي دهد حتي اگر خاصيت Dock مربوط به کنترل را مثلا بر روي Left قرار دهيد..(اگر مقادير عرض و ارتفاع براي کنترل Button تعريف نشده باشد) حال اگر دکمه ديگري با خاصيت Dock برابر با Right به کنترل DockPanel اضافه کنيد، فضاي موجود بر روي کنترل DockPanel به دوقسمت تقسيم بندي مي شوند. در اين حالت مقدار فضايي که دکمه اول احتياج دارد، در اختيارش قرار داده مي شود و بقيه فضاي موجود به دکمه دوم اختصاص داده مي شود. اين تقسيم بندي براي کنترل هاي فرزند ديگر ( در صورت وجود) نيز انجام مي شود تا نهايتا کل فضاي موجود بر روي کنترل DockPanel بين کليه کنترل هاي فرزندش تقسيم شود. خاصيت LastChildFill ذکر اين نکته ضروري است که تمامي مطالب گفته شده در بخش قبلي (ترتيب در Dock کردن کنترل ها) زماني درست مي باشند که خاصيت LastChildFill از کنترل DockPanel بر روي True تنظيم گردد. اگر اين خاصيت True باشد که مقدار پيش فرض آن نيز True مي باشد، آخرين کنترلي که بر روي کنترل DockPanel قرار مي گيرد، کل فضاي باقي مانده از کنترل DockPanel را به خود اختصاص مي دهد. در غير اين صورت همه کنترل ها به اندازه مقدار فضايي که نياز داشته باشند از کنترل DockPanel گرفته و بقيه فضاي باقي مانده ( اگر موجد باشد) بدون استفاده باقي خواهد ماند. به عنوان مثال اگر در کد فوق دستور LastChildFill="False" را اضافه کنيم: DockPanel LastChildFill="False">
نتيجه اجرا به صورت شکل زير خواهد بود:
در شکل فوق، آخرين کنترلي که به کنترل DockPanel اضافه شده است، button5 مي باشد. کنترل DockPanel به اين دکمه به اندازه مورد نيازش ( اندازه اي که بتواند متن داخل دکمه مشخص باشد) فضا مي دهد و بقيه فضاي موجود ( کادر زرد رنگ) بدون استفاده باقي خواهد ماند. کنترل WrapPanel کنترل WrapPanel نيز يکي از کنترل هاي کانتينر مي باشد. اين کنترل در طراحي واسط کاربري شما نقش زيادي نمي تواند بازي کند. در واقع مواردي که از اين کنترل مي توان استفاده کرد محدود و در بعضي از کاربرد هاي خاص به کار مي رود. کنترل WrapPanel عناصر فرزند خود را به دوصورت مي تواند تراز بندي کنيد. اين امر بستگي به خاصيت Orientation از اين کنترل دارد. اگر اين خاصيت بر روي Horizontal باشد ( حالت پيش فرض horizontal مي باشد)، عناصر به صورت سطري و در داخل اولين سطر از اين کنترل قرار ميگيرند. چنانچه مقدار فضاي مورد نياز براي کنترل هاي فرزند، بيش از فضاي موجود بر روي يک سطر باشد، عناصر فرزند به صورت اتواتيک به سطر بعدي شيفت داده مي شوند. اين عمل آن قدر تکرار مي گردد تا تمامي عناصر بر روي کنترل WrapPanel قرار داده شوند. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="HorizontalWrapPanel" Height="300" Width="300"> اين قطعه کد مربوط به پنجره اي است که يک کنترل WrapPanel به عنوان کنترل کانتينر آن قرار داده شده است. درون اين کنترل، شش دکمه قرار داده شده است که هر يک داراي خواص مربوط به خودش مي باشد. نتيجه حاصل از کد فوق در شکل زير نشان داده شده است:
همانطور که در شکل نيز مشخص است، عناصر روي کنترل WrapPanel به صورت سطري قرار گرفته اند. حال اگر در زمان اجرا، عرض پنجره فوق کم شود، بعضي از عناصر به سطر بعدي در کنترل WrapPanel شيفت داده مي شوند:
حال اگر خاصيت Orientation اين کنترل را بر روي Vertical تنظيم کنيد، عناصر به صورت ستوني تراز مي شوند، ابتدا ستون اول و چنانچه فضاي کافي براي قرار گيري عناصر بر روي ستون اول موجود نباشد، بقيه عناصر به ستون بعدي شيفت داده مي شوند. براي اعمال اين تغيير کافيست تگ آغازين کنترل WrapPanel را به صورت زير تغيير دهيد:
دو شکل زير نمايي از اجراي کد قبل را با تغييري که در تگ آغازين کنترل WrapPanel داده شده است را نشان مي دهد.
يکي از کاربر هايي که از WrapPanel ها مي تواند در آن بهره جست، ايجاد کنترل هايي مانند Tool strip مي باشد. (البته ابزار هاي مجزايي براي toolbar ها نيز موجود است). نکته: به عنوان مثال مي توانيد با اضافه کردن دستور FlowDirection="RightToLeft" يک تگ آغازين کنترل WrapPanel ، ستون آغازين را براي قرار گيري کنترل ها را از سمت راست به چپ تعيين کنيد. کنترل UniformGrid اين کنترل ظاهري شبيه به عنصر Gird (که در بخش بعدي توضيح داده خواهد شد) دارد. اين کنترل به تعدادي سطر و ستون با اندازه هاي يکسان تقسيم بندي مي شود. عناصر فرزند اين کنترل مي توانند در هريک از اين سلول ها قرار بگيرند. نحوه استفاده از اين کنترل به صورت زير مي باشد: . . . که شامل تعريف خود کنترل، تعداد سطر ها و تعداد ستون هاي آن مي باشد. اين کنترل براي موارد خاصي به کار برده مي شود و به ندرت در طراحي واسط هاي برنامه شما به کار برده مي شود. به عنوان مثال شکل زير يک جدول ضرب 5*5 را نشان مي دهد.
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="UniformGridContainer" Height="200" Width="200"> نکته: |
ضمائم:




















