<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x645;&#x646;&#x635;&#x629; Xamarin</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/page/2/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x645;&#x646;&#x635;&#x629; Xamarin</description><language>ar</language><item><title>&#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x639;&#x645;&#x644;&#x64A;&#x651;&#x629; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x642;&#x64A;&#x627;&#x633;&#x627;&#x62A; &#x641;&#x64A; Xamarin</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D9%91%D8%A9-%D8%AD%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3%D8%A7%D8%AA-%D9%81%D9%8A-xamarin-r414/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/xamarin-008.png.85d8002c76ca0a86a63b4b4924b9060c.png" /></p>

<p>
	سنتناول في هذا الدرس تطبيقين عمليّين حول كيفيّة التعامل مع القياسات في Xamarin. <a href="https://academy.hsoub.com/programming/c-sharp/%D9%85%D9%86%D8%B5%D8%A9-xamarin/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A9-%D9%81%D9%8A-xamarin-r413/" rel="">لقد تناولنا مفهوم القياسات في Xamarin.Forms</a> في الدرس السابق من هذه السلسلة، وأوضحنا أهميّة هذا المفهوم في التنسيق الصحيح لواجهة المستخدم عند استخدام شاشات متنوّعة لأجهزة أندرويد. سيكون التطبيق الأوّل بسيطًا للغاية، حيث ينحصر عمله في رسم مستطيل صغير بالأبعاد الحقيقيّة، وإظهاره بنفس المساحة على مختلف أنواع الشاشات. أمّا التطبيق الثاني فهو عبارة عن ساعة رقميّة بسيطة يتغيّر حجمها بحسب حجم الشاشة، وبحسب وضع الشاشة أيضًا (أفقي أم عمودي).
</p>

<p style="text-align: center;">
	<img alt="xamarin-008.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21070" data-unique="il2g0f6x3" src="https://academy.hsoub.com/uploads/monthly_2017_02/xamarin-008.png.a6c10c2ea42ee12fa22c148b5dff186c.png" style=""></p>

<h2 id="تطبيق-رسم-المستطيل">
	تطبيق رسم المستطيل
</h2>

<p>
	أنشئ تطبيقًا جديدًا سمّه RectangleApp من النوع Blank App (Xamarin.Forms Portable)، وكما جرت العادة أبقِ على المشروعين RectangleApp (Portable) وRectangleApp.Droid فقط. ثم أضف صفحة محتوى جديدة سمّها RectanglePage واحرص على أن تكون بانيتها على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_7">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">RectanglePage</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">BoxView</span><span class="pln"> rectangle </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BoxView</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">WidthRequest</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">64</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">HeightRequest</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">64</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">

    </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> rectangle</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الشيفرة البرمجيّة الموجودة في البانية <code>RectanglePage</code> بسيطة. حيث ننشئ كائنًا جديدًا من الصنف BoxView وهو عنصر مرئي تنحصر وظيفته في إكساب ناحية جماليّة لواجهة المستخدم. ضبطنا الخاصيّتين <code>HorizontalOptions</code> و<code>VerticalOptions</code> ليظهر هذا العنصر في وسط الشاشة. كما أسندنا الخاصيّتين <code>WidthRequest</code> و<code>HeightRequest</code> له كي نعيّن العرض والارتفاع على الترتيب.<br>
	لاحظ هنا أنّه كان من الممكن أن يكون اسميّ كل من الخاصيتين السابقتين على الشكل <code>Width</code> و<code>Height</code> فحسب. ولكن تمّ إضافة الكلمة <code>Request</code> لكلٍّ منهما، لكي يوحي ذلك أنّ القيم التي نُسندها إليهما قد لا يتمّ الالتزام بها بشكل دقيق. لاحظ أنّنا نُسند القيمة 1 * 64 لخاصيّة <code>WidthRequest</code> وهذا يعني بالطبع القيمة 64 بالواحدات المستقلّة عن الجهاز، أمّا الخاصيّة <code>HeightRequest</code> فقد أسندنا إليها القيمة 3 * 64 وهذا يعطينا 192 وحدة مستقلة عن الجهاز. تذكّر معي من الدرس السابق أنّ كل 64 وحدة مستقلة عن الجهاز تعادل 1 سنتيمتر، إذًا نرغب بأن يكون عرض المستطيل 1 cm وطوله 3 cm.<br>
	انتقل إلى الملف <code>App.cs</code> وتأكّد أنّ بانيته على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_9">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// The root page of your application</span><span class="pln">
    </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">RectanglePage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span></pre>

<p>
	نفّذ البرنامج باستخدام المفتاح F5 لتحصل على الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21067" href="https://academy.hsoub.com/uploads/monthly_2017_02/fig01.png.12840b8f0da1a86daa3427ea710c48fe.png" rel=""><img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21067" data-unique="ucmcd5w6p" src="https://academy.hsoub.com/uploads/monthly_2017_02/fig01.thumb.png.0b98df94d5de4c881d8bdb12b86b2bbb.png" style=""></a>
</p>

<p>
	حاول أن تستخدم مسطرة عاديّة وتقيس أبعاد هذا المستطيل على الشاشة مباشرةً، ستجد أنّ أبعاده قريبة من الأبعاد التي حدّدناها في الشيفرة (1 cm x 3 cm). إذا نفّذت هذا التطبيق على أيّ جهاز محمول ستحصل على نفس الشكل تقريبًا. إذًا استطعنا رسم نفس الشكل تقريبًا باستخدام الواحدات المستقلّة عن الجهاز وبصرف النظر عن دقّة الشاشة المستخدمة.
</p>

<h2 id="تطبيق-الساعة-الرقمية">
	تطبيق الساعة الرقميّة
</h2>

<p>
	سيكون هذا التطبيق متقدّمًا أكثر ويحتوي على مفاهيم مفيدة في البرمجة بشكل عام. الغاية من هذا التطبيق هو إنشاء ساعة رقميّة ذات تصميم بسيط تعرض الوقت بشكل آني كلّ ثانية. الميزة فيها أنّها ستشغل كامل عرض الشاشة تقريبًا بصرف النظر عن الجهاز المستخدم أو وضع تدوير الشاشة (أفقي أم عمودي). أي ستكون الساعة مرنة لتتناسب مع أيّ شاشة يعمل عليها التطبيق.<br>
	أنشئ تطبيقًا جديدًا سمّه DigitalClockApp من النوع Blank App (Xamarin.Forms Portable)، وأبقِ على المشروعين DigitalClockApp (Portable) وDigitalClockApp.Droid فقط. ثم أضف صفحة محتوى جديدة سمّها DigitalClockPage. عدّل محتويات الملف DigitalClockPage.cs ليبدو على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_11">
<span class="lit">1</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	
</span><span class="lit">4</span><span class="pln">	</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">DigitalClock</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">DigitalClockPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Label</span><span class="pln"> lblClock</span><span class="pun">;</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	
</span><span class="lit">10</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">DigitalClockPage</span><span class="pun">()</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	            lblClock </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	                </span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="pun">};</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	
</span><span class="lit">18</span><span class="pln">	            </span><span class="typ">SizeChanged</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> </span><span class="typ">DigitalClockPage_SizeChanged</span><span class="pun">;</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	
</span><span class="lit">20</span><span class="pln">	            </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">StartTimer</span><span class="pun">(</span><span class="typ">TimeSpan</span><span class="pun">.</span><span class="typ">FromSeconds</span><span class="pun">(</span><span class="lit">1</span><span class="pun">),</span><span class="pln"> </span><span class="typ">OneSecondPassed</span><span class="pun">);</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	
</span><span class="lit">22</span><span class="pln">	            </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lblClock</span><span class="pun">;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	
</span><span class="lit">25</span><span class="pln">	        </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">DigitalClockPage_SizeChanged</span><span class="pun">(</span><span class="pln">object sender</span><span class="pun">,</span><span class="pln"> </span><span class="typ">EventArgs</span><span class="pln"> e</span><span class="pun">)</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Width</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	                lblClock</span><span class="pun">.</span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Width</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">10.0</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	
</span><span class="lit">33</span><span class="pln">	        </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">OneSecondPassed</span><span class="pun">()</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	            lblClock</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">Now</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"h:mm:ss tt"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	
</span><span class="lit">37</span><span class="pln">	            </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	انتقل إلى الملف App.cs واحرص على أن تكون بانية الصنف App.cs على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_13">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// The root page of your application</span><span class="pln">
    </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DigitalClockPage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج باستخدام F5 ستحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21068" href="https://academy.hsoub.com/uploads/monthly_2017_02/fig02.png.156716097acf445c3eb3c9ee97f605a7.png" rel=""><img alt="fig02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21068" data-unique="hzzxu4zj8" src="https://academy.hsoub.com/uploads/monthly_2017_02/fig02.thumb.png.ea300803142c284da7a94e046a8ab948.png" style=""></a>
</p>

<p>
	لنبدأ الآن بمناقشة هذا التطبيق. صرّحنا في السطر 8 عن حقل خاص من نوع <code>Label</code> لصيقة اسمه <code>lblClock</code>، وقمنا في السطر 12 ضمن بانية الصنف <code>DigitalClockPage</code> بإنشاء كائن جديد وأسندناه إلى هذا الحقل. سنستخدم في هذا التطبيق وللمرّة الأولى حدثين. الأوّل هو الحدث <code>SizeChanged</code> للصفحة <code>DigitalClockPage</code> والثاني هو الحدث الذي ينتج من استخدام التابع الساكن <code>StartTimer</code> من الصنف <code>Device</code>، وهو حدث يتمّ تفعيله بعد مرور فترة زمنيّة يمكن تحديدها سلفًا أي أنّه سيلعب دور مؤقّت زمني. بالنسبة للحدث <code>SizeChanged</code> فقد عيّنا معالج حدث له في السطر 18. اسم معالج الحدث هو <code>DigitalClockPage_SizeChanged</code> وقد صرّحنا عنه في الأسطر من 25 حتى 31. تحدثنا عن الحدث <code>SizeChanged</code> في الدرس السابق، وكيف أنّه يُفعَّل كلّما تغيّر عرض أو ارتفاع العنصر المرئي المُسنَد إليه معالج الحدث. إذًا كلّما يتغيّر عرض أو ارتفاع الصفحة سيتم استدعاء معالج الحدث <code>DigitalClockPage_SizeChanged</code>. يتم في البداية ضمن معالج الحدث هذا اختبار كون عرض الصفحة أكبر من الصفر أم لا وذلك في السطر 27، لأنّ عرض الصفحة من الممكن أن يحمل قيمة تمهيديّة سالبة (-1) وهي قيمة لا نرغب بالتعامل معها بالطبع. يتم بعد ذلك ضبط حجم النص المُستخدَم والملائم للشاشة التي يعمل عليها التطبيق، وإليك كيف يحدث ذلك.<br>
	بمعزل عن Xamarin، يقيس حجم النص font size عادةً المسافة الرأسيّة المشغولة بين خطّين وهميين، يقع الخط الأوّل فوق أعلى النص بقليل، أمّا الخط الثاني فيقع تحت أسفل النص بقليل. الواحدة المستخدمة مع حجم الخط هي النقطة Point. حيث يُعتبر أنّ كل بوصة تحتوي على 72 نقطة. فالخط الذي قياسه 72 مثلًا يعني بأنّ ارتفاع أي حرف ضمنه لن يتجاوز البوصة الواحدة. أمّا بالنسبة لعرض أي حرف، فهو يساوي تقريبًا نصف قياس الخط المستخدم. فالخط الذي قياسه 12 نقطة مثلًا، سيكون عرض أي حرف فيه يساوي 6 نقاط تقريبًا.<br>
	يبقى الكلام السابق صحيحًا تمامًا عند البرمجة في Xamarin. ففي تطبيقنا هذا، سيُعرَض على الشاشة 9 أو 10 محارف بحسب الساعة الحالية. تتضمّن أرقام الساعة وعلامتي (:) بالإضافة إلى فراغ واحد وحرف واحد (“م” أو “ص”) يُشير إلى المساء أو الصباح. سنعتبر عدد المحارف 10 وهكذا فعندما نقسّم عرض الصفحة Width على عدد المحارف، سينتج معنا عرض المحرف الواحد من عرض الصفحة. وبما أنّ قياس الخط هو ضعف عرض المحرف تقريبًا كما وسبق أن أشرنا قبل قليل، لذلك يؤدي ضرب عرض المحرف الواحد بالعدد 2 إلى إيجاد قيمة تقريبيّة ولكنّها مقبولة إلى حدٍّ كبير لحجم الخط مُقاسًا بالواحدات المستقلّة، وهذا ما تُعبّر عنه العبارة البرمجية في السطر 29. وهكذا يتم ضبط حجم الخط للساعة الرقميّة ليتلاءم تمامًا مع عرض الصفحة على أيّ جهاز محمول.<br>
	بالنسبة للحدث الذي يتمّ تفعليه كل ثانية، فنحصل عليه من استدعاء التابع الساكن <code>StartTimer</code> من الصنف <code>Device</code> كما أسلفنا. يتطلّب هذا التابع وسيطين الأوّل هو الفترة الزمنيّة اللازمة لكي يتم تفعيل هذا الحدث، وهذا الوسيط من النوع <code>TimeSpan</code> وهي بنية <code>struct</code> تمثّل فترة زمنيّة محدّدة. وبما أنّنا نريد أن يتم تفعيل الحدث كل ثانية، لذلك فاستخدامنا التابع الساكن <code>FromSeconds</code> من البنية <code>TimeSpan</code> على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_15">
<span class="typ">TimeSpan</span><span class="pun">.</span><span class="typ">FromSeconds</span><span class="pun">(</span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	الذي يُرجع قيمة من البنية TimeSpan تمثّل ثانية واحدة فقط لأنّنا مرّرنا القيمة 1 لهذا التابع.<br>
	أمّا الوسيط الثاني فهو عبارة عن نائب delegate يُعبّر عن معالج هذا الحدث. هذا النائب هو من النوع Func وهو نوع نائب موجود ضمن نطاق الاسم <code>System</code>، يُغلّف هذا النائب تابع لا يتطلّب أيّ وسيط، ولكن يُرجع قيمة من النوع <code>bool</code>. وهذا ما يتحقّق بالنسبة لمعالج الحدث <code>OnSecondPassed</code> الذي أنشأناه خصيصًا لهذا الغرض (الأسطر من 33 حتى 38). ومرّرنا اسمه كوسيط ثانٍ إلى التابع <code>StartTimer</code>.<br>
	لاحظ أنّ معالج الحدث <code>OnSecondPassed</code> يُرجع دومًا القيمة true (السطر 37) وهو شرط استمرار عمل المؤقّت الزمني. نلاحظ في السطر 35 كيف يتم إسناد النص التنسيقي الذي يمثّل الوقت الحالي إلى الخاصية Text من اللصيقة <code>lblClock</code>. استخدمنا البنية <code>DateTime</code> للحصول على الوقت الحالي من خلال الخاصيّة Now. ثمّ استدعينا التابع <code>ToString</code> من <code>Now</code> ومرّرنا له نصًّا تنسيقيًّا للحصول على الوقت الحالي بالشكل الذي يلائم تطبيقنا:<br><code>enter code here</code>DateTime.Now.ToString(“h:mm:ss tt”);<br>
	إذا انتبهت إلى النص التنسيقي ستجد أنّنا قد كتبنا الحرف h الذي يُعبّر عن الساعة مرّة واحدة فقط، وسبب ذلك أنّني لا أريد من البرنامج أن يحجز خانتين في حال كانت الساعة قبل العاشرة (أي مكوّنة من خانة واحدة فقط). أمرٌ آخر، يُشير الحرفان <code>tt</code> إلى الوقت الحالي هل هو صباحًا أم مساءً. يظهر من صورة التطبيق عندما نفّذته على جهازي أنّ هناك حرفًا واحدًا فقط يظهر وهو “م” أي مساءً (وربما يظهر “ص” صباحًا حسب وقت التجريب). سبب ظهور هذا الشكل من الأحرف هو الإعدادات الإقليميّة الموجودة على جهازي. من الممكن أن نستخدم في تطبيقنا الحرفين AM بدلًا من “ص” أو أن نستخدم الحرفين PM بدلًا من “م” ولكنّنا نحتاج إلى تغيير الإعدادات الإقليمية الافتراضيّة في هذه الحالة.<br>
	سنجري تعديلًا على تطبيقنا هذا بحيث يعتمد الحرفين AM (قبل الظهر – صباحًا) أو الحرفين PM (بعد الظهر – مساءً). أجرِ التعديل البسيط التالي على العبارة البرمجيّة الموجودة في السطر 35 لتصبح على الشكل التالي: 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_17">
<span class="pln">lblClock</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">Now</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"h:mm:ss tt"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">.</span><span class="typ">InvariantCulture</span><span class="pun">);</span></pre>

<p>
	لقد مرّرنا وسيطًا إضافيًّا إلى التابع <code>ToString</code> (يخضع لزيادة التحميل <code>overloading</code>) يضمن بأن يستخدم هذا التابع الإعدادات الإقليميّة العامّة <code>InvariantCulture</code> (تشبه تلك الخاصّة بالولايات المتحدّة) عند تنسيق النص. هناك أمرٌ صغير آخر، لاحظ أنّ تطبيقنا سيستخدم محرفًا إضافيًّا لعرض الساعة، لأنّ AM أو PM مكوّنة من حرفين، وليس من حرف واحد كما كان عليه الحال مع “م” أو “ص”. هذا بالإضافة إلى كون AM أو PM عبارة عن أحرف طباعيّة كبيرة لذلك ستأخذ عرضًا أكبر من باقي المحارف. لذلك لا مشكلة إذا اعتبرنا أنّه لدينا الآن 13 محرف كحد أقصى بدلًا من 10 كما كان عليه الحال في النسخة القديمة من هذا التطبيق، وهي في الحقيقة قيمة تجريبيّة حصلت عليها بالتجريب. لذلك سنجري تعديلًا بسيطًا آخر في العبارة البرمجيّة في السطر 29 حيث سنستبدل القيمة 13 بالقيمة القديمة 10 كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9983_19">
<span class="pln">lblClock</span><span class="pun">.</span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Width</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">13.0</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span></pre>

<p>
	كما ستحتاج أيضًا إلى إضافة نطاق الاسم <code>System.Globalization</code> في الأعلى. إذا جرّبت تنفيذ البرنامج الآن ستحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21069" href="https://academy.hsoub.com/uploads/monthly_2017_02/fig03.png.5082fce8234307ec7f5ca3ba9e88ad64.png" rel=""><img alt="fig03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21069" data-unique="fn7ep86ry" src="https://academy.hsoub.com/uploads/monthly_2017_02/fig03.thumb.png.fa33817c306cc4ed1263198987f88573.png" style=""></a>
</p>

<p>
	جرّب أن تدوّر الشاشة، سترى أن النص سينسجم تمامًا مع هذه الحالة، ويملأ كامل عرض الشاشة بشكل جميل.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تناولنا في هذا الدرس تطبيقين عمليين يوضّحان كيفيّة التعامل مع واحدات القياس المستقلّة عن الجهاز independent-device units، كما تعرّفنا على مفاهيم برمجيّة جديدة تتمثّل في التعامل مع المؤقّت الزمني، وفي التعامل مع الإعدادات الإقليميّة. يُعتبر هذا الدرس تطبيقًا عمليًّا للدرس السابق يمكن اللجوء إليه لفهم أفضل حول هذا الموضوع.
</p>
]]></description><guid isPermaLink="false">414</guid><pubDate>Tue, 11 Oct 2016 23:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x642;&#x64A;&#x627;&#x633;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x627;&#x644;&#x634;&#x627;&#x634;&#x629; &#x641;&#x64A; Xamarin</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%82%D9%8A%D8%A7%D8%B3%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A9-%D9%81%D9%8A-xamarin-r413/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/xamarin-007.png.2ba280cd5f933935ef92948717d586e1.png" /></p>

<p>
	سنتحدث في هذا الدرس من سلسلة برمجة تطبيقات الأجهزة المحمولة باستخدام Xamarin عن موضوع مهم يسبّب في الكثير من الأحيان بعض الارتباك لمبرمجيّ تطبيقات الأجهزة المحمولة، وهو موضوع التعامل مع القياسات والحجوم على الشاشة. سنبدأ أولًا بلمحة تاريخيّة سريعة، ننتقل من خلالها إلى فهم واحدات القياسات المستخدمة في Xamarin.Forms.
</p>

<p style="text-align: center;">
	<img alt="xamarin-007.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21066" data-unique="442dkkg1m" src="https://academy.hsoub.com/uploads/monthly_2017_02/xamarin-007.png.585f39013d79d410d14f2387b6d941d5.png" style=""></p>

<h2 id="لمحة-تاريخية">
	لمحة تاريخيّة
</h2>

<p>
	يتكوّن أيّ جهاز عرض من مصفوفة مستطيلة من البيكسل Pixels. فأيّ جسم يُعرض على الشاشة سيكون له مساحة تُقدّر بالبيكسل. تعامل المبرمجون منذ البداية مع البيكسل كواحدة قياس معتمدة لرسم الأجسام والأشكال المختلفة على الشاشة. وعلى الرغم من أنّه لا ينبغي على المبرمج عادةً أن يعتمد على قياسات ثابتة للعناصر المرئيّة في التطبيقات التي يكتبها، إلّا أنّه في كثير من الأحيان يكون من الضروري القيام بذلك حسب متطلّبات التطبيق. فمع اختلاف أحجام الشاشات واختلاف كثافة البيكسل لكل شاشة نظرًا للتقدّم التقنيّ الذي شهده هذا المجال، أصبح أن يكون للتطبيق نفس الشكل تقريبًا على مختلف أنواع الشاشات أمرًا فيه تحدّ كبير للمبرمجين.<br>
	لشاشات سطح المكتب طيف واسع من قياسات البيكسل، من القياس القديم 640x480  (أي 640 بيكسل للعرض، و480 بيكسل للطول) حتى بلغت هذه الأيّام بضعة آلاف لكل بُعد. كما تتمتّع الشاشات أيضًا بقياس فيزيائي يُقدّر عادةً بالبوصة Inch، وهو المسافة القُطريّة لمستطيل الشاشة. فمن خلال قياس البيكسل لأيّ شاشة والقياس الفيزيائي لها، نستطيع حساب دقّة الشاشة resolution أو ما يُعرف بكثافة البيكسل في كلّ بوصة PPI وغالبًا ما يسمّى بعدد النقاط في كلّ بوصة DPI (اختصار لـ Dots Per Inch).<br>
	فمثلًا من أجل شاشة قديمة لها قياس بكسل 800x600، يمكننا ببساطة حسب نظرية فيثاغورث في المثلث القائم، أن نستنتج أنّ قطر هذه الشاشة يساوي 1000 بيكسل.
</p>

<p style="text-align: center;">
	<img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21061" data-unique="3pocp2zlc" src="https://academy.hsoub.com/uploads/monthly_2017_02/fig01.png.81eea8686dda5047cbecdce30fd0447b.png" style=""></p>

<p>
	حيث استخدمنا العلاقة التالية في حساب القطر: <img alt="formula-001.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21064" data-unique="xev7yaoh3" src="https://academy.hsoub.com/uploads/monthly_2017_02/formula-001.png.c43e692cbac131200be3eee661463371.png" style="width: 150px; height: auto;"></p>

<p>
	فإذا كان لهذه الشاشة القياس الفيزيائي 13 بوصة مثلًا فعندها يمكننا بسهولة أن نحسب كثافة البيكسل في البوصة أو DPI لها بالعلاقة البسيطة التالية:<img alt="formula-002.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21065" data-unique="eydlycwo9" src="https://academy.hsoub.com/uploads/monthly_2017_02/formula-002.png.8f0c5ca9eb4174d986022c8552f5da37.png" style="width: 150px; height: auto;"></p>

<p>
	بالمقابل ومن أجل نفس هذه الشاشة ذات 13 بوصة، يمكننا أن نجد في هذه الأيّام قياسات بيكسل مثل 2560x1600 وهذا ما يعطي DPI لهذه الشاشة يُقدّر بـ 230 تقريبًا. فهذا يعني أنّ أيّ جسم على الشاشة الجديدة، ولنقل أنّ مساحته 100 بيكسل مربّع مثلًا، سيشغل ثلث المساحة الظاهرية التي يشغلها الجسم نفسه ولكن على الشاشة القديمة، مما سيؤدّي بالطبع إلى اختلاف كبير في أشكال التطبيقات على الشاشات المختلفة.<br>
	بدأت تظهر حلول عمليّة في الواقع مع تطوّر أنظمة التشغيل الخاصّة بالحواسيب المكتبيّة، والتي تمّ تكييفها لاحقًا مع الأجهزة المحمولة. حيث عملت شركات مثل مايكروسوفت وآبل على ابتكار أنظمة قياس تعتمد على واحدات لا تتعلّق بالجهاز (الشاشة) device-independent units وذلك بدلًا من البيكسل. حيث يقع على عاتق نظام التشغيل أن يحوّل هذه القياسات المصمّمة بنظام القياس الجديد إلى قياسات بيكسل مناسبة. وهكذا يستطيع المبرمجون كتابة تطبيقات تعتمد نظام قياس مستقل، بحيث تظهر تطبيقاتهم بقياس موحّد تقريبًا على مختلف أنواع الشاشات.<br>
	سلكت غوغل في أندرويد نفس السلوك لضمان أن تظهر الأشكال ذات القياسات المحدّدة بشكل موحّد على جميع شاشات أجهزة أندرويد المتنوّعة أصلًا.
</p>

<h2 id="الحل-الذي-توفره-xamarinforms">
	الحل الذي توفّره Xamarin.Forms
</h2>

<p>
	وفّرت Xamarin.Forms حلّا جيّدًا لهذه المسألة من خلال الفرضيّة البسيطة التالية: كل 160 وحدة قياس (مستقلة عن الجهاز) تقابل بوصة واحدة. وهذا ما يُعادل 64 وحدة قياس لكل سنتيمتر. والفرضيّة السابقة صالحة من أجل أي تطبيق يعمل على أندرويد أو iOS أو Windows Phone.<br>
	أيّ عنصر مرئي يظهر على الشاشة يرث من الصنف VisualElement. يمتلك هذا الصنف خاصيّتين مفيدتين: Width وHeight. تُعبّر هاتين الخاصيتين عن عرض Width وارتفاع Height أي عنصر مرئي على الشاشة بواحدات مستقلة عن الجهاز كما اتفقنا. تكون القيمة الابتدائيّة لكل منهما -1 في البداية، وتعطينا قيمًا صحيحة فقط عندما يُجهَّز التخطيط الذي سيظهر على الشاشة ويأخذ كلّ عنصر مكانه.<br>
	يُعرّف الصنف VisualElement أيضًا حدثّا اسمه SizeChanged والذي يحدث عندما تتغيّر قيمة إحدى الخاصيتين Width أو Height. قد تتغيّر قيمتي هاتين الخاصيتين لأسباب متنوّعة منها تدوير الشاشة مثلًا.<br>
	من الممكن تثبيت معالج للحدث SizeChanged من أجل أي عنصر مرئي يظهر على الصفحة بما فيها الصفحة نفسها. سنتناول في الفقرة التالية برنامجًا بسيطًا يُظهر قياس الشاشة التي يعمل عليها ولكن بالواحدات المستقلّة عن الجهاز.
</p>

<h2 id="برنامج-الحصول-على-قياس-الشاشة">
	برنامج الحصول على قياس الشاشة
</h2>

<p>
	أنشئ تطبيقًا جديدًا من النوع Blank App (Xamarin.Forms Portable) وسمّه GetSize. وكما اتفقنا احذف جميع المشاريع باستثناء المشروعين GetSize (Portable) وGetSize.Droid. أضف صفحة محتوى جديدة ContentPage إلى المشروع GetSize (Portable) وسمّها GetSizePage واحرص على أن يكون الصنف GetSizePage على الشكل التالي:<br>
	1
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8057_13">
<span class="lit">1</span><span class="pln">	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">GetSizePage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	    </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Label</span><span class="pln"> label</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">GetSizePage</span><span class="pun">()</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	        </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">label </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	            </span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Large</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">)),</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            </span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	            </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="pun">};</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	
</span><span class="lit">14</span><span class="pln">	        </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">label</span><span class="pun">;</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	
</span><span class="lit">16</span><span class="pln">	        </span><span class="typ">SizeChanged</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> </span><span class="typ">GetSizePage_SizeChanged</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	
</span><span class="lit">19</span><span class="pln">	    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">GetSizePage_SizeChanged</span><span class="pun">(</span><span class="pln">object sender</span><span class="pun">,</span><span class="pln"> </span><span class="typ">EventArgs</span><span class="pln"> e</span><span class="pun">)</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	        label</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">String</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} \u00D7 {1}"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Width</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Height</span><span class="pun">);</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	لاحظ في البداية أنّنا صرّحنا عن الحقل الخاص label وهو من النوع Label في السطر 3، حيث سنُسند إليه مرجع للصيقة جديدة سننشئها لاحقًا في بانية الصنف GetSizePage في السطر 7. سبب إنشاء هذا الحقل، هو الحاجة للوصول إلى اللصيقة ضمن معالج الحدث كما سنرى بعد قليل. أسندنا خياري التموضع الأفقي HorizontalOptions والتموضع الرأسي VerticalOptions في السطرين 10 و11 على الترتيب لهذه اللصيقة الجديدة لتظهر في وسط الصفحة. لاحظ أنّنا لا نستخدم مخطّط مكدّس في هذا البرنامج، بل نُسند اللصيقة مباشرةً إلى الخاصيّة Content للصفحة في السطر 14. الأمر الجديد بالنسبة إلينا في هذه السلسلة هو إسناد معالج حدث event handler للحدث SizeChanged للصفحة في السطر 16. ومعالج الحدث الذي أسميته GetPageSize_SizeChanged مصرّح عنه في الأسطر من 19 حتى 22.<br>
	إذا نظرت إلى السطر 21 ستجد أنّنا نولّد نصًّا تنسيقيًّا لعرضه ضمن اللصيقة (نُسنده إلى الخاصيّة Text لها). لاحظ الرمز \u00D7 الذي يُستخدم لتوليد إشارة الضربxكما سنرى بعد قليل. كما تجدر الملاحظة أنّنا نقرأ خاصيّتي العرض Width والارتفاع Height للصفحة وندرجها ضمن النص التنسيقي المولّد. انتقل إلى بانية الصنف App واحرص على أن تكون كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8057_17">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// The root page of your application</span><span class="pln">
    </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">GetSizePage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج باستخدام F5 لتحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="21062" href="https://academy.hsoub.com/uploads/monthly_2017_02/fig02.png.f3428e4c1c34a44a3e55928660a91bb9.png" rel=""><img alt="fig02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21062" data-unique="xtlql3njn" src="https://academy.hsoub.com/uploads/monthly_2017_02/fig02.thumb.png.27faf64b521784a00cc7406ec0765a0e.png" style=""></a>
</p>

<p>
	أود أن أؤكّد على أنّ القياس الذي تراه في الشكل السابق هو بالواحدات المستقلّة عن الجهاز وليس بالبيكسل. وهو لا يتضمّن شريط الحالة status bar العلويّ، ولا يتضمّن أيضًا المساحة المخصّصة لظهور الأزرار في الأسفل (في حال كان الجهاز يدعم ذلك). إذا حاولت تدوير الشاشة 90 درجة. ستحصل على قياس مختلف:
</p>

<p style="text-align: center;">
	<img alt="fig03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21063" data-unique="z8a9pk1c5" src="https://academy.hsoub.com/uploads/monthly_2017_02/fig03.png.89320d1aacab93b26b332950aa239285.png" style=""></p>

<p>
	<strong>ملاحظة</strong><br>
	لقد نفّذت البرنامج السابق على جهاز Samsung Galaxy Core Prime.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	يُعتبر هذا الدرس أساسيًّا لفهم كيفيّة التعامل مع القياسات في تطبيقات Xamarin.Forms حيث تحدثنا عن القياسات بمفهوميها القديم والحديث. وسبل التعامل مع الواحدات المستقلّة عن الجهاز device-independent units ودورها الأساسيّ في توحيد قياسات العناصر المرئيّة ذات الأبعاد الثابتة على مختلف أنواع الشاشات. سنتناول في الدرس القادم أمثلة عمليّة مفيدة حول استخدام الواحدات المستقلّة عن الجهاز في كتابة تطبيقين بسيطين. يتناول التطبيق الأوّل رسم شكل بسيط ذو مساحة محدّدة على الشاشة، في حين يتناول التطبيق الثاني ساعة رقميّة بسيطة توائم النص المعروض بحسب حجم الشاشة التي يعمل عليها التطبيق.
</p>
]]></description><guid isPermaLink="false">413</guid><pubDate>Tue, 04 Oct 2016 23:00:00 +0000</pubDate></item><item><title>&#x645;&#x62E;&#x637;&#x637; &#x627;&#x644;&#x645;&#x643;&#x62F;&#x651;&#x633; StackLayout &#x641;&#x64A; Xamarin - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D9%85%D8%AE%D8%B7%D8%B7-%D8%A7%D9%84%D9%85%D9%83%D8%AF%D9%91%D8%B3-stacklayout-%D9%81%D9%8A-xamarin-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r404/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_01/Xamarin-StackLayout.png.1bfdb6bbaf95a429ff377d3983571aeb.png" /></p>

<p>
	تحدثنا في الدرس السابق من هذه السلسلة عن المبادئ الأساسيّة للتعامل مع مخطّط المكدّس <code>StackLayout</code>. سنتابع في هذا الدرس العمل معه، حيث سنقدّم مفاهيم أساسيّة لتموضع العناصر ضمن مخطّط المكدّس. سننشئ تطبيق بسيط يمكننا من خلاله فهم خيارات التموضع الرأسيّة والأفقيّة للعناصر ضمن مخطّط مكدّس <code>StackLayout</code>.<br>
	أنشئ تطبيقًا جديدًا (كما تعلّمنا في الدروس السابقة) وسمّه <code>LabelPositionsApp</code>. وأبق فقط على المشروعين <code>LabelPositionsApp (Portable</code>) و <code>LabelPositionsApp.Droid</code> ضمنه.
</p>

<h2 id="فهم-خيارات-التموضع-الرأسية">
	فهم خيارات التموضع الرأسيّة
</h2>

<p>
	انقر بزر الفأرة الأيمن على المشروع <code>LabelPositionsApp (Portable)</code> وأضف صفحة محتوى ContentPage جديدة (كما تعلّمنا من الدرس السابق) سمّها <code>VerticalOptionsPage</code>. سننشئ ضمن بانية الصنف <code>VerticalOptionsPage</code> مخطّط مكدّس وسنضيف إليه ثلاث لُصيقات. ستبدو هذه البانية على الشكل التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2116_7">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">VerticalOptionsPage</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.Start"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Start</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Accent</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.Center"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.End"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">End</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّنا قد استخدمنها الإسناد المباشر للخصائص أثناء إنشاء كائنات اللُصيقات. استخدمنا هذه المرّة الخاصيّة <code>VerticalOptions</code> لكل لصيقة أنشأناها. تُحدّد هذه الخاصيّة التموضع الرأسي لكل لصيقة ضمن مخطّط المكدّس. هذه الخاصيّة هي من نوع البنية <code>LayoutOptions</code> التي تحتوي على 8 حقول ساكنة <code>static</code> تُعبّر عن جميع خيارات التموضع الممكنة للعناصر المرئيّة. يتناول تطبيقنا البسيط السابق ثلاثةً من هذه الحقول وهي: <code>LayoutOptions.Start</code> للصيقة الأولى، و<code>LayoutOptions.Center</code> للصيقة الثانية، و<code>LayoutOptions.End</code> للصيقة الثالثة كما هو واضح من الشيفرة البرمجيّة. بالنسبة للخاصيتين <code>BackgroundColor</code> (لون الخلفية) و<code>TextColor</code> (لون النص) فهما موجودتان من باب تمييز اللُصيقات على الشاشة فحسب. هناك أمرٌ آخر، وهو أنّ مخطّط المكدّس في الشيفرة السابقة سيُعتبر رأسيًّا بشكل افتراضي، وذلك لأنّ خاصية الاتجاه <code>Orientation</code> له تحمل القيمة <code>StackOrientation.Vertical</code> بشكل افتراضيّ.<br>
	انتقل إلى الملف <code>App.cs</code> واحرص على أن تكون بانيته على الشكل التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2116_9">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// The root page of your application</span><span class="pln">
    </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">VerticalOptionsPage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	شغّل التطبيق باستخدام F5 لتحصل على شكل شبيه بما يلي:
</p>

<p>
	أضف الصورة fig01
</p>

<p>
	كما وسبق أن أوضحنا في درس سابق أنّنا عندما نُسند القيمة <code>LayoutOptions.Start</code> للخاصية <code>VerticalOptions</code> للصيقة فإنّها ستظهر أعلى الشاشة، أمّا عند إسناد القيمة <code>LayoutOptions.Center</code> لهذه الخاصية فستظهر اللصيقة في المنطقة الوسط للشاشة، أمّا القيمة <code>LayoutOptions.End</code> فستودّي إلى إظهار اللصيقة في المنطقة السفلية للشاشة، والمسافات الفارغة بين اللُصيقات السابقة هي نتيجة القيمة الافتراضيّة للخاصية <code>Spacing</code> لمخطّط المكدّس. ولكن هذا لا يحدث تمامًا بالنسبة لتطبيقنا السابق، فكلّ اللُصيقات تظهر كما لو أنّها تقع في جهة واحدة من الشاشة، وكلّها ذات ارتفاع ثابت، وواضح أيضًا أنّ هناك مساحة فارغة تمامًا غير مستخدمة (مساحة حرّة) تقع في الأسفل. سنتعلّم كيفيّة التحكم بمواضع بهذه اللُصيقات بصورة أكبر، ولكن من أجل هذا التطبيق علينا أن نفهم الفرق بين <code>Start</code> و<code>Center</code> و<code>End</code>.<br>
	لنجري الآن بعض التعديلات البسيطة على تطبيقنا السابق. استبدل محتويات بانية الصنف <code>VerticalOptionsPage</code> بالشيفرة التالية:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2116_11">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">VerticalOptionsPage</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.StartAndExpand"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">StartAndExpand</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Accent</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.Center"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.End"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">End</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أجريت تعديلًا بسيطًا على اللصيقة الأولى، حيث أسندت القيمة <code>LayoutOptions.StartAndExpands</code> للخاصية <code>VerticalOptions</code> لها. عندما تنفّذ التطبيق هذه المرّة ستحصل على الشكل التالي:
</p>

<p>
	أضف الصورة fig02
</p>

<p>
	القيمة <code>StartAndExpand</code> تعني ببساطة: تموضع أولًا ثم تمدّد. ستتموضع اللصيقة الأولى أوّل الشاشة كما حدث مع التطبيق السابق، ولكنّها ستشغل المساحة الحرّة (الفارغة) التي كانت موجودة مسبقًا، أي أنّ التّمدّد يكون على هذه المساحة الحرّة في حين أنّ النص الخاص باللصيقة سيكون بالأعلى (بسبب وجود <code>Start</code>). ودليل ذلك أنّ اللصيقتين التاليتين قد ظهرتا أسفل هذه المساحة الفارغة والتي أصبحت مشغولة الآن من قِبَل اللصيقة الأولى، ولو لم يصبح لون الخلفيّة لهذه المساحة الحرّة مماثلًا للون الخلفية للصيقة الأولى. لكي نفهم الموضوع بشكل أفضل عدّل الشيفرة الموجودة ضمن بانية الصنف <code>VerticalOptionsPage</code> لتحمل اللصيقة الثانية القيمة <code>LayoutOptions.CenterAndExpand</code> للخاصية <code>VerticalOptions</code>. في حين تحمل اللصيقتين الأولى والثالثة القيمتين <code>Start</code> و<code>End</code> على الترتيب (عدّل النص الذي سيظهر على اللُصيقات للتوضيح). لتحصل على الشكل التالي:
</p>

<p>
	أضف الصورة fig03
</p>

<p>
	انظر كيف شغلت اللصيقة الثانية المساحة الحرّة بالكامل هذه المرّة، في حين أنّ النص الخاص باللصيقة سيكون هذه المرّة بالوسط (بسبب وجود <code>Center</code>). ولعلّك تستطيع الآن تخمين الشكل الذي ستحصل عليه في حال أسندت القيمة <code>LayoutOptions.EndAndExpand</code> للخاصية <code>VerticalOptions</code> للصيقة الثالثة وأعدت اللصيقتين الأولى والثانية إلى القيمتين <code>Start</code> و<code>Center</code> على الترتيب. ستحصل على شكل شبيه بما يلي:
</p>

<p>
	أضف الصورة fig04
</p>

<p>
	أصبحت اللصيقة الثالثة تشغل المساحة الحرّة بالكامل، ويظهر نصّها في الأسفل (بسبب وجود <code>End</code>). وهكذا نكون قد ناقشنا ثلاث حالات يكون في كلّ منها إحدى اللُصيقات فقط هي من تحمل ميزة التّمدّد <code>Expand</code>. ولكن ماذا لو حملت لصيقتين أو أكثر ميزة التّمدّد <code>Expand</code> بنفس الوقت؟ الجواب بسيط، ستتقاسم هذه اللُصيقات المساحة الحرّة فيما بينها وتتموضع حسب قيم <code>Start</code> و<code>Center</code> و<code>End</code> الخاصّة بها. عدّل بانية الصنف <code>VerticalOptionsPage</code> لتحتوي على الشيفرة البرمجيّة التالية:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2116_13">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">VerticalOptionsPage</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.StartAndExpand"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">StartAndExpand</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Accent</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.CenterAndExpand"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">CenterAndExpand</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"LayoutOptoins.EndAndExpand"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">EndAndExpand</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج لتحصل على الشكل الجميل التالي:
</p>

<p>
	أضف الصورة fig05
</p>

<p>
	ستقسّم المساحة الحرّة الآن بين اللُصيقات الثلاث بالتساوي، ويتموضع النص في كل لصيقة بحسب القيم <code>Start</code> و<code>Center</code> و<code>End</code> لكلّ منها.<br>
	بقيت حالتان لم نناقشهما بعد، وهما <code>Fill</code> و<code>FillAndExpand</code>. ليس للقيمة <code>LayoutOptions.Fill</code> في الواقع أيّ دور عند إسنادها للخاصيّة <code>VerticalOptions</code> في حال كان الاتجاه <code>Orientation</code> لمخطّط المكدّس رأسيًا (كما في الأمثلة التي تناولناها حتى الآن)، في حين تعمل القيمة <code>LayoutOptionsFillAndExpand</code> بنفس الأسلوب ولكن بإشغال المساحة الحرّة المتاحة بحيث يمتد لون الخلفيّة في هذه المرّة ليشمل جميع المساحة المشغولة. انظر إلى الأشكال الأربعة التالية التي أعددتها للمقارنة، والتي توضّح تأثير وضع مزيج من قيم <code>LayoutOptions</code> معًا في نفس التطبيق السابق:
</p>

<p>
	أضف الصورة fig06
</p>

<p>
	الفرق الوحيد بين الشكلين السابقين هو في قيمة الخاصية <code>VerticalOptions</code> للصيقة الثالثة في كل منهما. ففي الشكل A تكون هذه القيمة <code>Fill</code> لذلك فهي لا تملك أيّ تأثير كما أسلفنا، في حين أنّه في الشكل B تصبح <code>FillAndExpand</code> لذلك تملأ هذه اللصيقة كامل المساحة الفارغة المتبقيّة. لننتقل الآن إلى المجموعة الثانية:
</p>

<p>
	أضف الصورة fig07
</p>

<p>
	في الشكل C تقتسم اللُصيقات الثلاث المساحة الحرّة فيما بينها لأنّ كلّا منهما يحمل الميزة <code>Expand</code>. أمّا في الشكل D فيتكرّر نفس الأمر مع ملاحظة أنّ اللصيقة الثانية أصبحت <code>FillAndExpand</code> والثالثة <code>EndAndExpand</code>، وهذا كلّ شيء.<br>
	ملاحظة<br>
	من الواضح أنّ النص يظهر دومًا في أعلى اللصيقة التي تحمل خاصيّتها <code>VerticalOptions</code> القيمة <code>FillAndExpand</code>. يعود سبب ذلك إلى خاصيّة أخرى في اللصيقة وهي التي تتحكّم بمحاذاة النص رأسيًّا في هذه الحالة. اسم هذه الخاصيّة <code>VerticalTextAlignment</code> وتقبل قيمًا من المعدودة <code>TextAlignment</code>. لا تعمل هذه الخاصيّة في حال كان اتجاه مخطّط المكدّس رأسيًّا، إلّا إذا كانت اللصيقة <code>FillAndExpand</code>.
</p>

<h2 id="فهم-خيارات-التموضع-الأفقية">
	فهم خيارات التموضع الأفقيّة
</h2>

<p>
	إذا كانت خيارات التموضع الرأسيّة واضحة بالنسبة إليك، فستكون خيارات التموضع الأفقيّة سهلة الفهم وبسيطة للغاية. فكل الكلام السابق لخيارات التموضع الرأسية سيبقى صحيحًا ولكن بالشكل المناسب لخيارات التموضع الأفقيّة.<br>
	أضف صفحة محتوى <code>ContentPage</code> جديدة للمشروع <code>LabelPositionsApp</code> (Portable) وسمّها <code>HorizontalOptionsPage</code>. سننشئ ضمن بانية الصنف <code>HorizontalOptionsPage</code> مخطّط مكدّس وسنضيف إليه أيضًا ثلاث لُصيقات. ستبدو هذه البانية على الشكل التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2116_15">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">HorizontalOptionsPage</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Orientation</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">StackOrientation</span><span class="pun">.</span><span class="typ">Horizontal</span><span class="pun">,</span><span class="pln">

        </span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Start"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Start</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Accent</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Center"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"End"</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">End</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ كيف أسندنا القيمة <code>StackOrientation.Horizontal</code> للخاصيّة <code>Orientation</code> لمخطّط المكدّس لكي يُصبح اتجاهه أفقيًّا. ولاحظ أيضًاً أنّنا نستخدم في هذه المرّة الخاصية <code>HorizontalOptions</code> (بدلًا من <code>VerticalOptions</code>) لكل لصيقة. عند تنفيذ البرنامج ستحصل على شكل شبيه بما يلي:
</p>

<p>
	أضف الصورة fig08
</p>

<p>
	لاحظ هنا أنّ عرض كل لصيقة يتناسب مع طول النص الموجود فيها، وهذا أمر لم نكن نصادفه في مخطّط المكدّس الرأسيّ. كما تجدر ملاحظة أنّني قد استخدمت في هذا التطبيق الأسماء <code>Start</code> و<code>Center</code> و<code>End</code> لعرضها ضمن محتويات اللُصيقات (ضمن الخاصيّة <code>Text</code> لها) بدون اسم البنية <code>LayoutOptoins</code> طلبًا للاختصار.<br>
	سنجري الآن بعض المقارنات بإسناد مزيج من خيارات <code>LayoutOptions</code> عندما يكون مخطّط المكدّس أفقيًّا. يمكنك التعديل على الشيفرة البرمجيّة للبرنامج السابق بحسب ما تراه ضمن الأشكال التالية لتحصل على نفس النتيجة.
</p>

<p>
	أضف الصورة fig09
</p>

<p>
	أضف الصورة fig10
</p>

<p>
	<strong>ملاحظة</strong>
</p>

<p>
	تحدثنا مسبقًا عن محاذاة النص ضمن اللصيقة. في الحقيقة توجد قاعدة مهمّة ولكنّها بسيطة في طريقة التعامل مع محاذاة النصوص ضمن اللُصيقات. تنص هذه القاعدة على أنّه إذا كان مخطّط المكدّس رأسيًّا عندها لن تعمل إلّا الخاصيّة <code>HorizontalTextAlignment</code> لمحاذاة النص أفقيًّا. أمّا إذا كان المكدّس أفقيًّا فلن تعمل عندها إلّا الخاصيّة <code>VerticalTextAlignment</code> لمحاذاة النص رأسيًّا أي دومًا بعكس اتجاه مخطّط المكدّس. ويُستثنى من هذه القاعدة حالتان:<br>
	الحالة الأولى إذا كان مخطط المكدّس رأسيًّا وكانت اللصيقة <code>FillAndExpand</code> فعندها يمكن استخدام الخاصيّة <code>VerticalTextAlignment</code> معها.<br>
	الحالة الثانية إذا كان مخطط المكدّس أفقيًّا وكانت اللصيقة <code>FillAndExpand</code> فعندها يمكن استخدام الخاصيّة <code>HorizontalTextAlignment</code> معها.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تعلّمنا في هذا الدرس كيفيّة التعامل المتقدّم مع مخطّط المكدّس، حيث تناولنا كيفيّة تموضع اللُصيقات ضمن مخطّط المكدّس سواءً كانت اتجاهه رأسيًّا أم أفقيًّا. في الحقيقة، يمكن تطبيق المعلومات الواردة هنا على أيّ عنصر مرئي تقريبًا، وليس فقط على اللُصيقات. أنصحك بأن تجري الكثير من التجارب على هذا الموضوع، وأن تضع أي استفسار قد يصادفك كسؤال ضمن التعليقات على هذا الدرس، لكي يتسنّى للجميع المشاركة فيه.
</p>

<p>
	<a class="ipsAttachLink" href="//academy.hsoub.com/applications/core/interface/file/attachment.php?id=20557" data-fileid="20557" rel="">.~lock.06-xamarin-stacklayout-part02.docx#</a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig01.png.4b85996dc02e649b1ac329142d0af46d.png" data-fileid="20558" rel=""><img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20558" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig01.thumb.png.99837f3081362e18d5a35bc8ff40bf0a.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig02.png.23d4c647709f6fbe09652b97634e9121.png" data-fileid="20559" rel=""><img alt="fig02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20559" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig02.thumb.png.322e5606754a62a88e82f6c4c52e135e.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig03.png.48f130decec8199b3f9532b23ec1a7c5.png" data-fileid="20560" rel=""><img alt="fig03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20560" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig03.thumb.png.86273b1b65e20f1938a828266379a390.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig04.png.be60f3fd4d7193afbdd46eed39b951f4.png" data-fileid="20561" rel=""><img alt="fig04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20561" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig04.thumb.png.af5d7515c71c62387069c9e4ae77f7cd.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig05.png.ad26707863a5aefbf718b3d78333f2ca.png" data-fileid="20562" rel=""><img alt="fig05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20562" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig05.thumb.png.d644e6f3a59c4c433f0af24d915c4a99.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig06.png.15a938c24acb44d4b72225662f4213d4.png" data-fileid="20563" rel=""><img alt="fig06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20563" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig06.thumb.png.847ff6ce715ebdca60d48f37b89b8719.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig07.png.e4a320b0fd610f74c3fbbb73134e3b5f.png" data-fileid="20564" rel=""><img alt="fig07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20564" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig07.thumb.png.f62d2440eb063eca89f6f9efbd036693.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig08.png.6f045a2ab83c4e46418f1369b01a550d.png" data-fileid="20565" rel=""><img alt="fig08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20565" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig08.thumb.png.fee1b08184e106d25efffeee5143a0c5.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig09.png.3e6017664bea8fb5b4dd2241b2657593.png" data-fileid="20566" rel=""><img alt="fig09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20566" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig09.thumb.png.ced51ff15affb0735198f7f08ebc5fd4.png"></a>
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2017_01/fig10.png.30abe2b8ee6056bd93fb2023471f07b7.png" data-fileid="20567" rel=""><img alt="fig10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20567" src="https://academy.hsoub.com/uploads/monthly_2017_01/fig10.thumb.png.36bd966f9e3ce236a3f9741b6b885318.png"></a>
</p>
]]></description><guid isPermaLink="false">404</guid><pubDate>Sun, 25 Sep 2016 23:00:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x62E;&#x637;&#x637; &#x627;&#x644;&#x645;&#x643;&#x62F;&#x651;&#x633; StackLayout &#x641;&#x64A; Xamarin - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x651;&#x644;</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D8%AE%D8%B7%D8%B7-%D8%A7%D9%84%D9%85%D9%83%D8%AF%D9%91%D8%B3-stacklayout-%D9%81%D9%8A-xamarin-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%91%D9%84-r402/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_12/Xamarin-StackLayout.png.3f37116348ae0282434c876f1216fdc7.png" /></p>

<p id="مخطط-المكدس-stacklayout-في-xamarin-الجزء-الأول">
	تعاملنا في الدروس السابقة مع عنصر واحد فقط يظهر على الشاشة. كان هذا العنصر عبارة عن لصيقة Label نُسندها إلى الخاصيّة <code>Content</code> لصفحة محتوى content page. في البرامج الحقيقية كما هو معروف، سنحتاج بالتأكيد إلى العديد من العناصر التي ستظهر على الشاشة لتلبية متطلّبات البرنامج. المشكلة التي تصادفنا هنا أنّ الخاصية Content لصفحة المحتوى لا تقبل سوى عنصر واحد يرث من الصنف <code>View</code>.<br>
	أوجدت Xamarin حلًا بسيطًا لهذه المشكلة يتمثّل في استخدام المخطّطات layouts. يمكن لأيّ مخطّط أن يستوعب أي عدد من العناصر التي يرث كل منها من الصنف <code>View</code>. في الحقيقة يُعتبر المخطّط بحدّ ذاته يرث من الصنف <code>Layout&lt;View&gt;</code> وهذا الصنف بدوره يرث بشكل غير مباشر من الصنف <code>View</code>. لذلك يمكن إسناد أيّ مخطط للخاصية Content مباشرةً. تدعم Xamarin أربعة أنواع من المخطّطات وهي:
</p>

<ol>
<li>
		المخطّط المطلق AbsoluteLayout
	</li>
	<li>
		مخطّط الشبكة GridLayout
	</li>
	<li>
		المخطّط النسبي RelativeLayout
	</li>
	<li>
		مخطّط المكدّس StackLayout.
	</li>
</ol>
<p>
	سنتناول ثلاثة مخطّطات في هذه السلسلة وهي: المطلق والشبكي والمكدّس. وسنبدأ في هذا المقال بمخطّط المكدّس StackLayout.
</p>

<h2 id="مخطط-المكدس-stacklayout">
	مخطّط المكدّس StackLayout
</h2>

<p>
	يمكن إضافة أي عدد من العناصر إلى هذا المخطّط. وسبب تسميته بهذا الاسم هو أنّه يرتّب العناصر المضافة إليه بشكل متكدّس stacked. يمتلك الصنف <code>StackLayout</code> خاصيتين إضافيتين عن باقي المخطّطات هما: <code>Orientation</code> وتُعبّر عن الاتجاه (أفقي أو رأسي) و<code>Spacing</code> وتمثّل التباعد بين العناصر المُضافة إلى المخطّط ولها القيمة الافتراضيّة <code>6.0</code>. لنتناول الآن مثال بسيط يوضّح آلية التعامل مع هذا المخطّط المفيد.
</p>

<h2 id="تطبيق-colorsapp-لعرض-بعض-الألوان">
	تطبيق ColorsApp لعرض بعض الألوان
</h2>

<p>
	أنشئ تطبيقًا جديدًا كما تعلّمنا من الدروس السابقة بحيث يكون من النوع <code>Blank App (Xamarin.Forms Portable)</code> وسمّه <code>ColorsApp</code>. بعد إنشاء التطبيق في Visual Studio أبق فقط على المشروعين <code>ColorsApp (Portable)</code> و <code>ColorsApp.Droid</code>.<br>
	أضف إلى المشروع <code>ColorsApp (Portable)</code> صفحة محتوى سمّها <code>ColorsListPage</code> (انقر بزر الفأرة الأيمن على المشروع واختر Add ثم اختر New Item. وبعد ظهور النافذة، اختر من الجهة اليسرى Cross-Platform، ومن وسط الشاشة اختر Forms ContentPage). بعد إنشاء هذه الصفحة سنلاحظ أنّها تحتوي بالفعل على مخطّط مكدّس جاهز. انظر إلى محتويات هذه الصفحة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4366_7">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Reflection</span><span class="pun">.</span><span class="typ">Emit</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">ColorsApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello ContentPage"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
                </span><span class="pun">},</span><span class="pln">
            </span><span class="pun">};</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ كيف أنّنا نُسند كائنًا جديدًا من الصنف StackLayout إلى الخاصيّة Content ضمن البانية ColorsListPage. لاحظ أيضّا كيف أنّ المخطّط StackLayout يحتوي على خاصيّة اسمها Children تُعبّر عن العناصر الأبناء (كلّ منها يرث من الصنف View) التي نرغب بإضافتها إلى المكدّس. استبدل محتويات الملف ColorsListPage.cs بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4366_9">
<span class="lit">1</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Reflection</span><span class="pun">.</span><span class="typ">Emit</span><span class="pun">;</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	
</span><span class="lit">7</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	
</span><span class="lit">9</span><span class="pln">	</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">ColorsApp</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Color</span><span class="pln"> </span><span class="typ">Color</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	
</span><span class="lit">17</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pun">()</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	            </span><span class="typ">ColorInfo</span><span class="pun">[]</span><span class="pln"> colors </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pun">[]</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Aqua"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Blue</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Blue"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Gray</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Gray"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Black"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Silver</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Silver"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Red</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Red"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Maroon</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Maroon"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Yellow"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Olive</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Olive"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Lime</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Lime"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Green</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Green"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Navy</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Navy"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Teal</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Teal"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Pink</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Pink"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">37</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Fuchsia</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Fuchsia"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Purple</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Purple"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	            </span><span class="pun">};</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	
</span><span class="lit">41</span><span class="pln">	            </span><span class="typ">StackLayout</span><span class="pln"> stackLayout </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pun">();</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	
</span><span class="lit">43</span><span class="pln">	            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> colors</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	                stackLayout</span><span class="pun">.</span><span class="typ">Children</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">47</span><span class="pln">	                    </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> colors</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">,</span><span class="pln">
</span><span class="lit">48</span><span class="pln">	                    </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> colors</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Color</span><span class="pun">,</span><span class="pln">
</span><span class="lit">49</span><span class="pln">	                    </span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Large</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">))</span><span class="pln">
</span><span class="lit">50</span><span class="pln">	                </span><span class="pun">});</span><span class="pln">
</span><span class="lit">51</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	
</span><span class="lit">53</span><span class="pln">	            </span><span class="typ">Padding</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Thickness</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
</span><span class="lit">54</span><span class="pln">	
</span><span class="lit">55</span><span class="pln">	            </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> stackLayout</span><span class="pun">;</span><span class="pln">
</span><span class="lit">56</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">57</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">58</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	لقد أضفنا صنفًا بسيطًا جديدًا اسمه <code>ColorInfo</code> إلى هذا الملف (الأسطر من 11 حتى 15). ورغم أنّ وجود صنفين في نفس الملف هو عادة برمجيّة سيئة، إلّا أنّني آثرت ذلك طلبًا للتبسيط. تنحصر وظيفة هذا الصنف في الاحتفاظ بمعلومات بسيطة عن أيّ: قيمة اللون <code>Color</code> واسمه <code>Name</code>. أنشأنا في السطر 21 مصفوفة من الصنف <code>ColorInfo</code> وأسندناها إلى المتغيّر <code>colors</code>. ستحتوي هذه المصفوفة كما هو واضح على 16 لون. ننشئ بعد ذلك كائن جديد من الصنف <code>StackLayout</code> ونسنده إلى المتغيّر <code>stackLayout</code> (السطر 41)، ثم ندخل حلقة <code>for</code> (السطر 43) وظيفتها المرور على عناصر المصفوفة <code>colors</code>، وبحيث تُنشئ في كل دورة لصيقة Label جديدة وتُعيّن لها النص ولونه وحجمه، وتضيف هذه اللصيقة مباشرةً إلى مخطّط المكدّس <code>stackLayout</code> عن طريق التابع <code>Add</code> للخاصيّة <code>Children</code> منه. بعد ذلك نُحدّد مقدار الحشوة <code>padding</code> للصفحة (السطر 53) وفي النهاية نُسند المتغيّر <code>stackLayout</code> إلى الخاصية <code>Content</code> للصفحة (السطر 55). لتجربة هذا التطبيق، انتقل أولًا إلى الملف <code>App.cs</code> واحرص أن تكون بانية الصنف <code>App</code> على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5229_7">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// The root page of your application</span><span class="pln">
    </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج باستخدام F5 لتحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="20533" href="https://academy.hsoub.com/uploads/monthly_2016_12/fig01.png.666fa6a7233741210cc4206e434929af.png" rel=""><img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20533" data-unique="kk0tmocdi" src="https://academy.hsoub.com/uploads/monthly_2016_12/fig01.thumb.png.927f37d32599e67db863f9f4ac45550a.png" style=""></a>
</p>

<p>
	نلاحظ هنا أمرين مهمّين. الأوّل أنّ بعض الألوان لا تظهر بشكل جيّد على الخلفية السوداء (وهي الخلفية الافتراضية لتطبيقات Xamarin في أندرويد) لأنّ التباين اللوني ليس جيّدًا، بل إنّ الكلمة <code>Black</code> لن تظهر لأنّ لونها يماثل لون الخلفية الأسود. أمّا الأمر الثاني، فلدينا بالأساس 16 لون إلّا أنّه ظهر 12 لون منها فقط. من الممكن أن يختلف عدد الألوان الظاهرة عندك بحسب الشاشة التي تستخدمها، فقد تظهر جميعها مثلًا، ولكن على كلّ الأحوال ستواجه بالتأكيد تطبيقات في المستقبل لن تظهر فيها جميع العناصر دفعةً واحدة على الشاشة. في الواقع نحتاج إلى آلية لتمرير المحتويات <code>scrolling</code> مثل أيّ تطبيق أندرويد آخر. سنعالج الآن كلًّا من الأمرين السابقين.
</p>

<h2 id="تطبيق-colorsapp-المحسن">
	تطبيق ColorsApp المحسّن
</h2>

<p>
	سنعالج في البداية مسألة التباين اللوني التي من الممكن حلّها بإضافة تابع جديد إلى الصنف <code>ColorsListPage</code> واسمه <code>GetSuitableBackground</code>. تنحصر وظيفة هذا التابع بحساب مقدار الإنارة <code>luminance</code> وفق ثوابت عدديّة متعارف عليها على أنّها مثالية. فإذا كانت الإنارة للّون المراد إظهاره أكبر من 0.5 فستكون الخلفية سوداء، أمّا إذا كانت أقل من أو تساوي 0.5 فستكون الخلفية بيضاء. مما يمنح تباينًا مناسبًا لعرض الألوان على الشاشة. انظر الشيفرة البرمجيّة الخاصّة بهذا التابع:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5229_9">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">Color</span><span class="pln"> </span><span class="typ">GetSuitableBackground</span><span class="pun">(</span><span class="typ">Color</span><span class="pln"> color</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">double</span><span class="pln"> luminance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.30</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> color</span><span class="pun">.</span><span class="pln">R </span><span class="pun">+</span><span class="pln"> 
                        </span><span class="lit">0.59</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> color</span><span class="pun">.</span><span class="pln">G </span><span class="pun">+</span><span class="pln"> 
                        </span><span class="lit">0.11</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> color</span><span class="pun">.</span><span class="pln">B</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">return</span><span class="pln"> luminance </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.5</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">White</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُعبّر الخصائص <code>color.R</code> و <code>color.G</code> و <code>color.B</code> عن المكوّنات الأحمر والأخضر والأزرق على الترتيب للّون الممرّر لهذا التابع والمراد إيجاد لون الخلفية المناسب له. أمّا الثوابت <code>0.30</code> و <code>0.59</code> و <code>0.11</code> فهي ثوابت تُعتبر مثالية لإيجاد إنارة اللون ويمكنك تغييرها إذا أحببت.<br>
	أمّا بالنسبة لمسألة تمرير محتويات الشاشة فحلّها بسيط، ويتمثّل في استخدام الصنف <code>ScrollView</code> حيث نُنشئ كائن جديد منه، ونُسند المتغيّر <code>stackLayout</code> إلى الخاصيّة <code>Content</code> من ذلك الكائن، ثم نُسند ذلك الكائن الجديد إلى الخاصيّة <code>Content</code> لصفحة المحتوى <code>ColorsListPage</code> بدلًا من إسناد <code>stackLayout</code> مباشرةً إليها كما كنّا نفعل في البرنامج السابق. انظر إلى الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5229_11">
<span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ScrollView</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> stackLayout
</span><span class="pun">};</span></pre>

<p>
	انظر الآن إلى الشيفرة الكاملة بعد إجراء التعديلات السابقة عليها:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5229_13">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Reflection</span><span class="pun">.</span><span class="typ">Emit</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">ColorsApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Color</span><span class="pln"> </span><span class="typ">Color</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ColorsListPage</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="typ">ColorInfo</span><span class="pun">[]</span><span class="pln"> colors </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pun">[]</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Aqua"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Blue</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Blue"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Gray</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Gray"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Black"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Silver</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Silver"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Red</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Red"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Maroon</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Maroon"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Yellow"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Olive</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Olive"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Lime</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Lime"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Green</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Green"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Navy</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Navy"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Teal</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Teal"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Pink</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Pink"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Fuchsia</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Fuchsia"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ColorInfo</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Color</span><span class="pun">=</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Purple</span><span class="pun">,</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="str">"Purple"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">};</span><span class="pln">

            </span><span class="typ">StackLayout</span><span class="pln"> stackLayout </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pun">();</span><span class="pln">

            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> colors</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                stackLayout</span><span class="pun">.</span><span class="typ">Children</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> colors</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">,</span><span class="pln">
                    </span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> colors</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Color</span><span class="pun">,</span><span class="pln">
                    </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GetSuitableBackground</span><span class="pun">(</span><span class="pln">colors</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Color</span><span class="pun">),</span><span class="pln">
                    </span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Large</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">))</span><span class="pln">
                </span><span class="pun">});</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="typ">Padding</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Thickness</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">

            </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ScrollView</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> stackLayout
            </span><span class="pun">};</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">Color</span><span class="pln"> </span><span class="typ">GetSuitableBackground</span><span class="pun">(</span><span class="typ">Color</span><span class="pln"> color</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">double</span><span class="pln"> luminance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.30</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> color</span><span class="pun">.</span><span class="pln">R </span><span class="pun">+</span><span class="pln"> 
                               </span><span class="lit">0.59</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> color</span><span class="pun">.</span><span class="pln">G </span><span class="pun">+</span><span class="pln"> 
                               </span><span class="lit">0.11</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> color</span><span class="pun">.</span><span class="pln">B</span><span class="pun">;</span><span class="pln">

            </span><span class="kwd">return</span><span class="pln"> luminance </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.5</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">White</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تأمّل الشيفرة السابقة، وتأكّد من فهمها بشكل جيّد. ثم نفّذ البرنامج باستخدام F5 لتحصل على شكل شبيه بما يلي، علمًا أنّني قد استخدمت ميزة التمرير الجديدة لإظهار بقية العناصر التي لم تكن تظهر معنا من قبل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="20534" href="https://academy.hsoub.com/uploads/monthly_2016_12/fig02.png.02477b634a4d8a4da07bc4c9dac9970c.png" rel=""><img alt="fig02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20534" data-unique="rz0acq8t8" src="https://academy.hsoub.com/uploads/monthly_2016_12/fig02.thumb.png.6733d147e2cb0be2e81a1f75817ae199.png" style=""></a>
</p>

<p>
	ستلاحظ أنّ كلّ لون يظهر في هذه القائمة، له لون خلفيّة مناسب له لإظهاره بالشكل الأمثل.<br><strong>ملاحظة</strong><br>
	يمكنك استخدام الخاصيّة <code>Spacing</code> لمخطّط المكدّس لزيادة أو إنقاص مقدار التباعد بين اللصائق labels التي تظهر على الشاشة. للخاصيّة <code>Spacing</code> القيمة الافتراضيّة <code>6.0</code> كما أسلفنا، جرّب أن تعيّن القيمة 0 لها مثلًا وانظر على ماذا ستحصل. يمكنك تعيين هذه الخاصيّة بالنسبة للبرنامج السابق بأن تضيف السطر التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5229_15">
<span class="pln">stackLayout</span><span class="pun">.</span><span class="typ">Spacing</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></pre>

<p>
	بعد السطر التالي مباشرةً:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5229_17">
<span class="typ">StackLayout</span><span class="pln"> stackLayout </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pun">();</span></pre>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على مبادئ التعامل مع مخطّط المكدّس <code>StackLayout</code> الذي يُستخدَم في تطبيقات Xamarin على نحو واسع لترتيب العناصر المرئية على الشاشة بشكل متكدّس. تعرّفنا أيضًا على كيفيّة إكساب مخطّط المكدّس ميزة التمرير لكي نستطيع عرض العناصر التي لا تظهر على الشاشة. سنتابع عملنا مع مخطّط المكدّس في الدرس التالي، حيث سنتحدّث عن المزيد من المزايا المهمّة التي يتمتّع بها هذا المخطّط.
</p>
]]></description><guid isPermaLink="false">402</guid><pubDate>Thu, 22 Sep 2016 07:32:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x646;&#x635;&#x648;&#x635; &#x641;&#x64A; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; Xamarin</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-xamarin-r386/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/xamarin-text-manipulation.png.f75ea05e8abd178911d4151b627d406d.png" /></p>

<p>
	يُعتبر التعامل مع النصوص من المهام البرمجيّة الأساسيّة في جميع أنواع التطبيقات بما فيها تطبيقات الأجهزة المحمولة. توفّر Xamarin تقنيّات جيّدة للتعامل مع النصوص، سنتناول العديد منها من خلال هذا الدرس، وأيضًا من خلال دروس لاحقة في هذه السلسلة. سنعالج في هذا الدرس بعضًا من الحالات التي قد تواجه المطوّر عند التعامل مع النصوص في التطبيقات التي يُنشئها.
</p>

<p style="text-align: center;">
	<img alt="xamarin-text-manipulation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19332" data-unique="o3nalcyar" src="https://academy.hsoub.com/uploads/monthly_2016_10/xamarin-text-manipulation.png.c0a9f4a61fa22f1a7710e0384a3cdf6b.png"></p>

<h2>
	التعامل مع المقاطع النصية
</h2>

<p>
	نحتاج في الكثير من الأحيان أن نعرض نصًّا طويلًا بعض الشيء على الشاشة. قد يأتي هذا النص من مستند أو من خدمة ويب web service أو من غيرها من المصادر. المتنوّعة، وينبغي أن يتمكّن التطبيق من التعامل مع نصوص بمثل هذا الحجم. كما فعلنا من الدرس السابق، <a href="https://academy.hsoub.com/programming/c-sharp/%D9%85%D9%86%D8%B5%D8%A9-xamarin/%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-xamarin-r379/" rel="">أنشأ مشروعًا جديدًا</a> من النوع (Blank App (Xamarin.Forms Portable وسمّه <span style="font-family:courier new,courier,monospace;">TextManipulationApp</span>. أبق فقط على المشروعين (<span style="font-family:courier new,courier,monospace;">TextManipulationApp</span> (Portable و <span style="font-family:courier new,courier,monospace;">TextManipulationApp.Droid</span>.
</p>

<p>
	سنضيف الآن صفحة محتوى content page جديدة ولكن بطريقة مختلفة ومختصرة عما فعلناه في الدرس السابق. انقر بزر الفأرة الأيمن على المشروع (TextManipulationApp (Portable واختر <strong>Add</strong> ثم من القائمة الفرعية التي ستظهر اختر <strong>New Item</strong>. اختر من الجهة اليسرى للنافذة التي ستظهر العقدة Cross-Platform، وبعد تحديث محتويات القسم الأوسط من النافذة، اختر نوع الملف<strong> Forms ContentPage</strong> وامنحه الاسم <span style="font-family:courier new,courier,monospace;">ParagraphPage</span> من مريع الاسم <strong>Name</strong> في الأسفل، وبعد ذلك انقر <strong>Add</strong>. كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<img alt="imageproxy.php?img=&amp;key=e4ac65570db3469d" class="ipsImage ipsImage_thumbnailed" data-fileid="o_1auj3vmvdcm7d7m1occs3d1hkih" data-unique="kys1991oa" src="" style="opacity: 1; display: none;"><a class="ipsAttachLink ipsAttachLink_image" data-fileid="19328" href="https://academy.hsoub.com/uploads/monthly_2016_10/57f9686547713_fig01(2).png.0c9c05a36d497ab75cc79c66382aa353.png" rel=""><img alt="fig01 (2).png" class="ipsImage ipsImage_thumbnailed" data-fileid="19328" data-unique="yxxp2a7ak" src="https://academy.hsoub.com/uploads/monthly_2016_10/57f9686767d10_fig01(2).thumb.png.61c0e492aacef03fabc540efd4624564.png"></a>
</p>

<p>
	بعد أن يضيف Visual Studio هذا الملف، ستكون محتوياته على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_8">
<span class="pln">using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Reflection</span><span class="pun">.</span><span class="typ">Emit</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">

using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

namespace </span><span class="typ">TextManipulationApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ParagraphPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ParagraphPage</span><span class="pun">()</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
			</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
			</span><span class="pun">{</span><span class="pln">
				</span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
					</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello ContentPage"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
				</span><span class="pun">}</span><span class="pln">
			</span><span class="pun">};</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	توجد نطاقات أسماء غير ضرورية هنا ولكن لا بأس بها حاليًا. لاحظ أنّ الصنف <span style="font-family:courier new,courier,monospace;">ParagraphPage</span> يرث من الصنف <span style="font-family:courier new,courier,monospace;">ContentPage</span> بشكل افتراضي، كما لاحظ أنّ بانية الصنف <span style="font-family:courier new,courier,monospace;">ParagraphPage</span> جاهزة، وتحتوي على مثال بسيط جاهز. احذف محتويات هذه البانية، لنبدأ العمل على تطبيقنا. سننشئ لصيقة Label تحتوي على مقطع نصيّ مكتوب باللغة العربية. اكتب الشيفرة التالية ضمن بانية الصنف <span style="font-family:courier new,courier,monospace;">ParagraphPage</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_12">
<span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
    </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"تُعتبر منصّة Xamarin في الوقت الحالي، من أهمّ منصّات تطوير تطبيقات الأجهزة المحمولة المتوفّرة،"</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
	</span><span class="str">" والتي يبدو أنّها ستبقى على الواجهة لوقت ليس بالقليل، "</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
	</span><span class="str">"خصوصًا بعد استحواذ شركة مايكروسوفت على الشركة المنتجة لها والتي تحمل أيضًا نفس الاسم."</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
	</span><span class="str">"سنتعلّم من خلال هذه السلسلة كتابة تطبيقات عمليّة من خلال استخدام هذه التقنيّة الواعدة."</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	انتقل إلى الملف<span style="font-family:courier new,courier,monospace;"> App.cs</span> ضمن المشروع (TextManipulationApp (Portal واحرص على أن تكون بانية الصنف <span style="font-family:courier new,courier,monospace;">App</span> على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_14">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">// The root page of your application</span><span class="pln">
	</span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ParagraphPage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج باستخدام <span style="font-family:courier new,courier,monospace;">F5</span> لتحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19329" href="https://academy.hsoub.com/uploads/monthly_2016_10/57f96868a975a_fig02(1).png.6ca7536bbdc8f2838e2ba84f475cafd7.png" rel=""><img alt="fig02 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="19329" data-unique="ejgu6nrth" src="https://academy.hsoub.com/uploads/monthly_2016_10/57f96868c4a92_fig02(1).thumb.png.ba2dbf21159b89888c2235942afd36c8.png"></a>
</p>

<p>
	تجدر الملاحظة أنّه تتم مُحاذاة كامل النص رأسيًّا في منتصف الشاشة. سبب ذلك هو إسناد القيمة <span style="font-family:courier new,courier,monospace;">LayoutOptions.Center</span> إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">VerticalOptions</span> (خيارات التموضع الرأسيّة) للصيقة <span style="font-family:courier new,courier,monospace;">Label</span>. لاحظ أيضًأ أنّ النص في الشكل السابق تمّت مُحاذاته نحو اليسار، وليس إلى اليمين كما هو متوقّع بالنسبة للنصوص العربيّة. يعود سبب ذلك إلى أنّ الخاصيّة <span style="font-family:courier new,courier,monospace;">HorizontalTextAlignment</span> من الصنف <span style="font-family:courier new,courier,monospace;">Label</span> والمسؤولة عن المحاذاة الأفقيّة للنص ضمن اللصيقة سيكون لها القيمة الافتراضيّة <span style="font-family:courier new,courier,monospace;">TextAlignment.Start</span> عند تشغيل البرنامج. و <span style="font-family:courier new,courier,monospace;">TextAlignment</span> عبارة عن معدودة <span style="font-family:courier new,courier,monospace;">enum</span> تحتوي على ثلاثة قيم هي: <span style="font-family:courier new,courier,monospace;">Start</span> و <span style="font-family:courier new,courier,monospace;">Center</span> و <span style="font-family:courier new,courier,monospace;">End</span>. وبما أنّ شاشة الجهاز المحمول تُقسم إلى ثلاثة مناطق أساسيّة أفقيًا: <span style="font-family:courier new,courier,monospace;">Start</span> للمنطقة اليسرى و <span style="font-family:courier new,courier,monospace;">Center</span> للمنطقة الوسطى (المركزية) و <span style="font-family:courier new,courier,monospace;">End</span> للمنطقة اليمنى من الشاشة لذلك ستتم محاذاة النص إلى اليسار بدلًا من اليمين. إذا أردنا أن تمم مُحاذاة النص إلى اليمين، فكل ما عليك فعله هو إسناد القيمة <span style="font-family:courier new,courier,monospace;">TextAlignment.End</span> للخاصية <span style="font-family:courier new,courier,monospace;">HorizontalTextAlignment</span>، وهذا ما سنفعله بعد قليل. وهناك أمر آخر نلاحظه أيضًا من الشكل السابق، وهو أنّ النص يقترب كثيرًا من حواف الشاشة حتى يكاد يلتصق بها. حلّ هذا الموضوع بسيط ويتمثّل في إضافة حشوة <span style="font-family:courier new,courier,monospace;">padding</span> على حواف الشاشة، وهي عبارة عن مساحة صغيرة يمكن تعيينها برمجيًا للشاشة، نستطيع من خلالها التحكم بمساحة الهامش على الأطراف الأربعة لها. انظر الآن إلى بانية الصنف <span style="font-family:courier new,courier,monospace;">ParagraphPage</span> بعد التعديلات المطلوبة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_16">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">ParagraphPage</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
		</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"تُعتبر منصّة Xamarin في الوقت الحالي، من أهمّ منصّات تطوير تطبيقات الأجهزة المحمولة المتوفّرة،"</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
			</span><span class="str">" والتي يبدو أنّها ستبقى على الواجهة لوقت ليس بالقليل، "</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
			</span><span class="str">"خصوصًا بعد استحواذ شركة مايكروسوفت على الشركة المنتجة لها والتي تحمل أيضًا نفس الاسم."</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
			</span><span class="str">"سنتعلّم من خلال هذه السلسلة كتابة تطبيقات عمليّة من خلال استخدام هذه التقنيّة الواعدة."</span><span class="pun">,</span><span class="pln">

		</span><span class="typ">HorizontalTextAlignment</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TextAlignment</span><span class="pun">.</span><span class="typ">End</span><span class="pln">
	</span><span class="pun">};</span><span class="pln">
	
	</span><span class="typ">Padding</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Thickness</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أضفنا أولًا الخاصيّة <span style="font-family:courier new,courier,monospace;">HorizontalTextAlignment</span> إلى اللصيقة <span style="font-family:courier new,courier,monospace;">Label</span> وأسندنا إليها القيمة <span style="font-family:courier new,courier,monospace;">TextAlignment.End</span> لمحاذاة النص ضمن اللصيقة نحو اليمين (لاحظ أنّ الفاصلة العادية تفصل بين الخصائص). كما أضفنا الخاصية <span style="font-family:courier new,courier,monospace;">Padding</span> (من الصنف <span style="font-family:courier new,courier,monospace;">ParagraphPage</span>) وأسندنا إليها كائنًا جديدًا من الصنف <span style="font-family:courier new,courier,monospace;">Thickness</span> (السماكة). تخضع بانية الصنف <span style="font-family:courier new,courier,monospace;">Thickness</span> لزيادة التحميل حيث لها أكثر من شكل. استخدمت الشكل الأخير الذي يقبل أربعة وسائط تمثّل مقادير الحشوة <span style="font-family:courier new,courier,monospace;">padding</span> من اليسار <span style="font-family:courier new,courier,monospace;">left</span> والأعلى <span style="font-family:courier new,courier,monospace;">top</span> واليمين <span style="font-family:courier new,courier,monospace;">right</span> والأسفل <span style="font-family:courier new,courier,monospace;">bottom</span> على الترتيب. قد تتساءل عن واحدة القياس المستخدمة هنا، ولكنني سنؤجل النقاش حولها إلى درس لاحق. عند تنفيذ البرنامج ستحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19330" href="https://academy.hsoub.com/uploads/monthly_2016_10/57f968698e868_fig03(1).png.91181350b4983dcf5cd7c6457a08d37d.png" rel=""><img alt="fig03 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="19330" data-unique="pssmajp4y" src="https://academy.hsoub.com/uploads/monthly_2016_10/57f96869a2ffd_fig03(1).thumb.png.2f724f692380df82a3d4cbfc8ab5fa17.png"></a>
</p>

<p>
	لاحظ الآن كيف تمّت مُحاذاة النص نحو اليمين (ضمن اللصيقة <span style="font-family:courier new,courier,monospace;">Label</span>)، ولاحظ أيضًا كيف ابتعد النص عن حواف الشاشة بعد تعيين الخاصية <span style="font-family:courier new,courier,monospace;">Padding</span> لصفحة المحتوى <span style="font-family:courier new,courier,monospace;">ParagraphPage</span>.
</p>

<p>
	<strong>ملاحظة</strong>: أرجو التمييز بين الخاصيتين <span style="font-family:courier new,courier,monospace;">HorizontalOptions</span> و <span style="font-family:courier new,courier,monospace;">HorizontalTextAlignment</span> للصيقة <span style="font-family:courier new,courier,monospace;">Label</span>. فالأولى تمثّل خيارات التموضع الأفقية للصيقة ضمن الشاشة. أمّا الثانية فتمثّل محاذاة النص الأفقية ضمن اللصيقة. وبنفس الأسلوب، يجب التمييز بين الخاصيتين <span style="font-family:courier new,courier,monospace;">VerticalOptions</span> و <span style="font-family:courier new,courier,monospace;">VerticalTextAlignment</span> للصيقة <span style="font-family:courier new,courier,monospace;">Label</span> ولكن من الناحية الرأسية بدلًا من الأفقية.
</p>

<h2>
	تنسيق النص ضمن اللصيقة
</h2>

<p>
	يمكن تنسيق النص الموجود ضمن لصيقة <span style="font-family:courier new,courier,monospace;">Label</span> بالشكل الذي نرغبه عن طريق استخدام خاصيّة أخرى من خصائص اللصيقة وهي <span style="font-family:courier new,courier,monospace;">FormattedText</span>.
</p>

<p>
	الخاصية <span style="font-family:courier new,courier,monospace;">FormattedText</span> هي من الصنف <span style="font-family:courier new,courier,monospace;">FormattedString</span>، والذي يحتوي بدوره على خاصية اسمها <span style="font-family:courier new,courier,monospace;">Spans</span> من النوع <span style="font-family:courier new,courier,monospace;">&lt;IList&lt;Span </span>فهي عبارة عن مجموعة (قائمة) من كائنات من النوع <span style="font-family:courier new,courier,monospace;">Span</span>. أيُّ كائن من الصنف <span style="font-family:courier new,courier,monospace;">Span</span> ينسّق جزءًا محدّدًا من النص الكلي، ويتم التحكم بهذا التنسيق من خلال ست خصائص من الصنف <span style="font-family:courier new,courier,monospace;">Span</span> هي: جزء النص المراد تنسيقه <span style="font-family:courier new,courier,monospace;">Text</span> واسم الخط <span style="font-family:courier new,courier,monospace;">FontFamily</span> وحجم الخط <span style="font-family:courier new,courier,monospace;">FontSize</span> وسمات الخط <span style="font-family:courier new,courier,monospace;">FontAttributes</span> ولون النص <span style="font-family:courier new,courier,monospace;">ForegroundColor</span> ولون الخلفية <span style="font-family:courier new,courier,monospace;">BackgroundColor</span>.
</p>

<p>
	إذا شعرت ببعض الارتباك من الكلام السابق فلا بأس! سنوضّح هذه الأمور من خلال مثال بسيط يعمل على إضافة بعض التأثيرات على النص الذي يظهر على الشاشة. انظر أولًا إلى الشكل الذي أود الحصول عليه ثم لنوضّح كيفيّة فعل ذلك برمجيًّا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19331" href="https://academy.hsoub.com/uploads/monthly_2016_10/fig04.png.84a55b4cd917aec57fb68ddd79022ad7.png" rel=""><img alt="fig04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19331" data-unique="rtvnmmngn" src="https://academy.hsoub.com/uploads/monthly_2016_10/fig04.thumb.png.81d249d0a6a4d66bdadc871e9a7f4cab.png"></a>
</p>

<p>
	قد لا يبدو التنسيق السابق جميلًا، ولكنّه كفيل بتوضيح الفكرة. لاحظ في البداية أنّ كلمة "المجد" قد لوّنت باللون الأزرق مع خلفية صفراء. أمّا عبارة "لن تبلغ المجد حتى تلعق الصبر" فتم تلوينها باللون Aqua مع ملاحظة أنّ هذه العبارة ذات حجم نص أكبر من حجم النص للعبارة التي قبلها. لقد أضفت صنف محتوى جديد Forms ContentPage سميته <span style="font-family:courier new,courier,monospace;">FormattedParagraphPage</span> إلى نفس المشروع (TextManipulationApp (Portable السابق، وبأسلوب مماثل للأسلوب الذي أضفنا فيه الصنف <span style="font-family:courier new,courier,monospace;">ParagraphPage</span> في بداية هذا الدرس. انظر إلى محتويات الملف<span style="font-family:courier new,courier,monospace;"> FormattedParagraphPage.cs</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_19">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Reflection</span><span class="pun">.</span><span class="typ">Emit</span><span class="pun">;</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
</span><span class="lit">6</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">
</span><span class="lit">8</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	namespace </span><span class="typ">TextManipulationApp</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">FormattedParagraphPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">FormattedParagraphPage</span><span class="pun">()</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	            </span><span class="typ">FormattedString</span><span class="pln"> formattedString </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FormattedString</span><span class="pun">();</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"لا تحسبنّ "</span><span class="pun">,</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	            </span><span class="pun">});</span><span class="pln">
</span><span class="lit">21</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"المجد "</span><span class="pun">,</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	                </span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	                </span><span class="typ">ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Blue</span><span class="pun">,</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	            </span><span class="pun">});</span><span class="pln">
</span><span class="lit">28</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	            formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"تمرًا أنت آكله "</span><span class="pun">,</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	            </span><span class="pun">});</span><span class="pln">
</span><span class="lit">33</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	            formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	                </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"لن تبلغ المجد حتى تلعق الصبر."</span><span class="pun">,</span><span class="pln">
</span><span class="lit">37</span><span class="pln">	                </span><span class="typ">ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	                </span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Large</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">))</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	            </span><span class="pun">});</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	            
</span><span class="lit">41</span><span class="pln">	            </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	                </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	                </span><span class="typ">FormattedText</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> formattedString</span><span class="pun">,</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	                </span><span class="typ">HorizontalTextAlignment</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TextAlignment</span><span class="pun">.</span><span class="typ">End</span><span class="pun">,</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	                </span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Medium</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">))</span><span class="pln">
</span><span class="lit">47</span><span class="pln">	            </span><span class="pun">};</span><span class="pln">
</span><span class="lit">48</span><span class="pln">	
</span><span class="lit">49</span><span class="pln">	            </span><span class="typ">Padding</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Thickness</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
</span><span class="lit">50</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">51</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	بدأنا في البانية (السطر 15) بإنشاء كائن من الصنف <span style="font-family:courier new,courier,monospace;">FormattedString</span> وإسناده إلى المتغيّر <span style="font-family:courier new,courier,monospace;">formattedString</span>. بعد ذلك بدأنا بإضافة النصوص المنسّقة إلى القائمة <span style="font-family:courier new,courier,monospace;">Spans</span> باعتماد الأسلوب البسيط التالي (الأسطر من 17 حتى 20):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_21">
<span class="pln">formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"لا تحسبنّ "</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	استخدمنا التابع <span style="font-family:courier new,courier,monospace;">Add</span> من القائمة <span style="font-family:courier new,courier,monospace;">Spans</span> لإضافة كائن من النوع <span style="font-family:courier new,courier,monospace;">Span</span> حيث أنشأنا هذا الكائن وأسندنا الخاصية <span style="font-family:courier new,courier,monospace;">Text</span> له مباشرة عند الإنشاء. النص في الشيفرة السابقة لا يحمل أي تنسيق خاص. في الحقيقة لقد كرّرنا هذا الأسلوب من أجل كل جزء من النص الكامل. ولكنّنا اعتمدنا بعض التنسيقات النصيّة المختلفة أحيانًا. انظر مثلًا إلى الشيفرة الموجودة في الأسطر من 22 حتى 27:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_23">
<span class="pln">formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"المجد "</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">BackgroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Yellow</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Blue</span><span class="pun">,</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	هذه المرّة نسّقنا النص "المجد" بحيث أسندنا اللون الأصفر كلون للخلفية <span style="font-family:courier new,courier,monospace;">BackgroundColor</span>، واللون الأزرق للون النص <span style="font-family:courier new,courier,monospace;">ForegroundColor</span>. انظر أيضًا إلى جزء النص الذي أضفناه في الأسطر من 34 حتى 39:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_25">
<span class="pln">formattedString</span><span class="pun">.</span><span class="typ">Spans</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Span</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"لن تبلغ المجد حتى تلعق الصبر."</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Aqua</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">FontSize</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Large</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">))</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	هذه المرّة سيكون لون الخط Aqua وحجم الخط كبير Large. لاحظ كيف أسندنا قيمة حجم الخط إلى الخاصية <span style="font-family:courier new,courier,monospace;">FontSize</span>. استخدمت لهذا الغرض التعبير التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_27">
<span class="typ">Device</span><span class="pun">.</span><span class="typ">GetNamedSize</span><span class="pun">(</span><span class="typ">NamedSize</span><span class="pun">.</span><span class="typ">Large</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">typeof</span><span class="pun">(</span><span class="typ">Label</span><span class="pun">))</span></pre>

<p>
	الصنف <span style="font-family:courier new,courier,monospace;">Device</span> يمثّل الجهاز الحالي الذي يعمل عليه تطبيقنا، ويحتوي على العديد من التوابع الساكنة المفيدة. من هذه التوابع استخدمنا التابع <span style="font-family:courier new,courier,monospace;">GetNamedSize</span> الذي يُرجع حجم الخط المطلوب حسب الوسائط الممرّرة له. الوسيط الأول هو <span style="font-family:courier new,courier,monospace;">NamedSize.Large</span> أي أنّنا نريد حجم كبير للخط (<span style="font-family:courier new,courier,monospace;">NamedSize</span> هي معدودة)، والوسيط الثاني هو نوع العنصر المراد تطبيق هذا الخط عليه. في حالتنا نريد تطبيق هذا الخط على لصيقة <span style="font-family:courier new,courier,monospace;">Label</span> لذلك مرّرنا<span style="font-family:courier new,courier,monospace;"> (typeof(Label</span> كوسيط ثانٍ حيث يُرجع النوع الخاص <span style="font-family:courier new,courier,monospace;">Type</span> باللصيقة <span style="font-family:courier new,courier,monospace;">Label</span>. هذا هو الأسلوب المفضّل في تعيين القياسات المناسبة لأيّ شيء يخطر ببالك، وذلك لأنّ الأجهزة التي نعمل عليها ستكون شاشاتها مختلفة القياسات بكلّ تأكيد، لذلك فنرغب أن نترك للتابع <span style="font-family:courier new,courier,monospace;">GetNamedSize</span> مهمة القيام بالعمليات الحسابية المناسبة لإرجاع حجم الخط المناسب بالنسبة لحجم الشاشة التي يعمل عليها البرنامج حاليًا، وللحجم المراد الحصول عليه (في مثالنا هذا أردنا الحصول على حجم خط كبير <span style="font-family:courier new,courier,monospace;">NamedSize.Large</span> وتوجد بالتأكيد قياسات أخرى).
</p>

<p>
	ما تبقى من البرنامج سهل للغاية، حيث نقوم في السطر 44 بإسناد المتغيّر <span style="font-family:courier new,courier,monospace;">formattedString</span> إلى الخاصية <span style="font-family:courier new,courier,monospace;">FormattedText</span> للصيقة. يكفل ذلك بعرض النص منسّقًا على الشاشة، مع الانتباه إلى أنّنا لم نستخدم في هذه الحالة الخاصية Text للصيقة.
</p>

<p>
	هناك أمر أخير يجب الانتباه إليه. لاحظ أنّنا في السطر 46 نُسند حجم خط جديد إلى الخاصية <span style="font-family:courier new,courier,monospace;">FontSize</span> الخاصة باللصيقة. سيكون هذا الخط متوسّط الحجم (لاحظ الوسيط الأوّل <span style="font-family:courier new,courier,monospace;">NamedSize.Medium</span>). الفكرة هنا هو أنّ هذا الخط سيطبّق على كل جزء من النص (موجود ضمن كائن <span style="font-family:courier new,courier,monospace;">Span</span>) في حال لم تُعيّن الخاصية <span style="font-family:courier new,courier,monospace;">FontSize</span> الخاصة بهذا الجزء. فمثلًا لن يطبّق هذا الحجم على جزء النص المعيّن في الأسطر بين 34 و 39. وذلك لأنّ هذا الجزء قد عيّن حجم خط خاص به (<span style="font-family:courier new,courier,monospace;">NamedSize.Large</span>) كما رأينا قبل قليل.
</p>

<p>
	<strong>ملاحظة</strong>: ستحتاج لتجربة هذا البرنامج إلى تعديل بسيط ضمن بانية الصنف <span style="font-family:courier new,courier,monospace;">App</span> ضمن الملف<span style="font-family:courier new,courier,monospace;"> App.cs</span>. احرص على أن تكون البانية على الشكل التالي لتستخدم صنفنا الجديد <span style="font-family:courier new,courier,monospace;">FormattedParagraphPage</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4379_29">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">// The root page of your application</span><span class="pln">
	</span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FormattedParagraphPage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على مبادئ التعامل مع النصوص في Xamarin وبنينا للمرّة الأولى تطبيقين بسيطين يعرضان بعض المعلومات على المستخدم. تعلّمنا كيفيّة محاذاة النصوص وإجراء بعض عمليّات التنسيق عليها مثل تغيير لون النص ولون الخلفية لأيّ كلمة أو عبارة. لم يتناول هذا الدرس كيفيّة معالجة الحالة التي يكون فيها النص كبيرًا ويحتاج إلى وسيلة لتمريره لعرض محتوياته كاملة. سنعالج هذه المسألة في درس لاحق.
</p>
]]></description><guid isPermaLink="false">386</guid><pubDate>Wed, 07 Sep 2016 18:06:00 +0000</pubDate></item><item><title>&#x62A;&#x646;&#x635;&#x64A;&#x628; Visual Studio 2015 Community &#x648;&#x62A;&#x62C;&#x647;&#x64A;&#x632; Xamarin &#x644;&#x644;&#x639;&#x645;&#x644;</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-visual-studio-2015-community-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-xamarin-%D9%84%D9%84%D8%B9%D9%85%D9%84-r373/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_08/xamarin-visual-studio-install.png.deffaaffe7f10fc152a81139464b7ad0.png" /></p>

<p>
	سنتابع العمل في <a href="https://academy.hsoub.com/search/?tags=xamarin+101" rel="">سلسلة برمجة تطبيقات الأجهزة المحمولة باستخدام Xamarin</a>، حيث سنعمل في هذا الدرس على تنزيل وتنصيب برنامج Visual Studio 2015 Community الذي يأتي بشكل مجّاني من مايكروسوفت. حيث أنّ منصّة Xamarin أصبحت تأتي مع Visual Studio كميّزة من المزايا الاختياريّة التي من الممكن اختيارها أثناء تنصيب Visual Studio، وذلك بعد استحواذ مايكروسوفت على شركة Xamarin.
</p>

<p style="text-align: center;">
	<img alt="xamarin-visual-studio-install.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18851" data-unique="0c6odu2ba" src="https://academy.hsoub.com/uploads/monthly_2016_08/xamarin-visual-studio-install.png.d88fe62e93ede532bb7eb8be5f7b3a58.png"></p>

<h2>
	تنزيل وتنصيب Visual Studio 2015 Community
</h2>

<p>
	أنصح أن يكون التنصيب على ويندوز 10 أو ويندوز 8.1. انتقل إلى <a href="http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx" rel="external nofollow">صفحة تنزيل بيئة التطوير Visual Studio 2015</a>. كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18839" href="https://academy.hsoub.com/uploads/monthly_2016_08/57b2c8e2377ba_fig01(1).png.da00568deb0605913dda114eb2e344ac.png" rel="external"><img alt="fig01 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="18839" data-unique="tbqqhzq69" src="https://academy.hsoub.com/uploads/monthly_2016_08/57b2c8e40aafd_fig01(1).thumb.png.5798cc0251126c72ad6dc90deeb7de4c.png"></a>
</p>

<p>
	سنختار الإصدار Community من اليسار، لذلك فانقر الزر <strong>Download Community Free</strong>. سيعمل المتصفّح على تحميل ملف تنفيذي صغير اسمه <span style="font-family:courier new,courier,monospace;">vs_community.exe</span> وهو برنامج الإعداد الذي سيعمل على تنصيب Visual Studio Community. سيشّغل المتصفّح هذا البرنامج بعد تنزيله فورًا، لذلك سيعطيك ويندوز تحذير أمان أنّه برنامج تنفيذي، ويعرض عليك تشغيله أو إلغاء العمليّة. اقبل تشغيله من خلال نقر الزر <strong>Run</strong> كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<img alt="fig02 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="18840" data-unique="rvdzccqvm" src="https://academy.hsoub.com/uploads/monthly_2016_08/57b2c8e54e59f_fig02(1).png.a02a66c9139ce82ecbc94708f56652f7.png"></p>

<p>
	سيعمل برنامج الإعداد ويبدأ بجلب بيانات التنصيب من الإنترنت. قد يستغرق ذلك القليل من الوقت قبل أن تحصل على النافذة في الشكل التالي، التي تخيّرنا بين خيارين للتنصيب: افتراضي Default ومخصّص Custom:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18841" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig03.png.c7dacb79878c2dd7515b61da1505e952.png" rel="external"><img alt="fig03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18841" data-unique="o0amqndz2" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig03.thumb.png.41629eceed6202729131eeb2bb77b3fe.png"></a>
</p>

<p>
	انقر الخيار المخصّص <strong>Custom</strong> ثمّ انقر <strong>Next</strong>. لينتقل برنامج الإعداد إلى نافذة المزايا المطلوب تنصيبها. انتقل إلى العقدة<strong> Cross Platform Mobile Development</strong> وانشرها لتصل إلى الميّزة (C#/.NET (Xamarin v4.0.4 وهو الإصدار الحالي لمنصّة Xamarin حين كتابة هذا الدرس. قد يختلف هذا الإصدار بالنسبة إليك. انقر صندوق الاختيار بجوار هذه الميّزة، سيؤدّي ذلك إلى اختيار مزايا أخرى بشكل تلقائي. في الحقيقة سيكون حجم حزمة البيانات التي ستُنزّل من الإنترنت كبيرة نسبيًّا. بالنسبة لهذه السلسلة لن نحتاج إلى جميع هذه المزايا، لذلك انتقل إلى العقدة <strong>Programming Languages </strong>وانشرها، وأزل الإشارة من صندوق الاختيار الموجود بجانب ++Visual C.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18842" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig04.png.a914845bbdb1d0c69d6dca8198b106d9.png" rel="external"><img alt="fig04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18842" data-unique="liah6qok9" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig04.thumb.png.c6d50cd107e3047f8a0a328837113146.png"></a>
</p>

<p>
	انقر الزر <strong>Next</strong> لنصل إلى المرحلة النهائيّة قبل البدء بعمليّة التنصيب، وهي المرحلة التي تلخّص ما سيقوم به برنامج الإعداد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18843" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig05.png.9f515cbcb55fcd9223e9ab73d46b8fa3.png" rel="external"><img alt="fig05.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18843" data-unique="culpphuqn" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig05.thumb.png.bde36f06c1242031c217b058cf9f9ca0.png"></a>
</p>

<p>
	انقر الزر <strong>Install</strong> لتبدأ عمليّة التنصيب التي ستأخذ بعض الوقت بحسب سرعة الإنترنت لديك. ستتضمّن عملية التنصيب تحميل حزمة التطوير البرمجيّة SDK الخاصة بأندرويد، بالإضافة إلى تثبيت واجهتين برمجيّتين أو أكثر افتراضيًّا مثل <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr></abbr> 19 و <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr></abbr> 21. على العموم يمكن تثبيت الواجهات البرمجيّة التي ترغبها بعد انتهاء التنصيب وذلك من خلال مدير الحزم والواجهات في أندرويد Android SDK Manager الذي يأتي مع حزمة التطوير البرمجيّة SDK. اقرأ <a href="https://academy.hsoub.com/programming/android/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A3%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF-1-r300/" rel="">هذا المقال هنا على أكاديميّة حسّوب للمزيد من المعلومات حول الواجهات البرمجيّة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr> ودعمها للأجهزة المشغّلة لأندرويد</a>.
</p>

<h2>
	التشغيل الأول لبيئة التطوير Visual Studio
</h2>

<p>
	عند تشغيل بيئة التطوير Visual Studio 2015 للمرّة الأولى، سيطلب منك Visual Studio تسجيل الدخول باستخدام حساب بريد إلكتروني من مايكروسوفت (كحساب بريد إلكتروني على Hotmail مثلًا) كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18844" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig06.png.7ea4af7348fe8ef77941833175fa4502.png" rel="external"><img alt="fig06.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18844" data-unique="bjsfbhsn9" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig06.thumb.png.ab005af9206bd0c53899f6818e4c34d2.png"></a>
</p>

<p>
	انقر الزر <strong>Sign in</strong> لتسجيل الدخول، لتحصل على النافذة الخاصّة بإدخال البريد الإلكتروني. أدخل البريد الإلكتروني ثم انقر <strong>Continue</strong> وإذا طلب منك Visual Studio أن تحدّد نوع البريد الإلكتروني، فاختر شخصيّ<strong> Personal Email</strong>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18845" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig07.png.7708ad32de2a7ada5eea49e6adcc520f.png" rel="external"><img alt="fig07.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18845" data-unique="4dyynfjwx" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig07.thumb.png.13045834f0a4f9d8402d68ed62d9c3fb.png"></a>
</p>

<p>
	بعد ذلك ستصل إلى نافذة تطلب منك كلمة المرور لحساب البريد الإلكتروني الذي أدخلته قبل قليل. أدخل كلمة المرور، ثم انقر<strong> Sign in</strong>، لتصل إلى النافذة الرئيسيّة لتطبيق Visual Studio كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18846" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig08.png.f522d0a4ecc55432e0ec5bb75ae5dbc4.png" rel="external"><img alt="fig08.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18846" data-unique="itt3j9k56" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig08.thumb.png.b3b2d43be088906e580b380426a5f971.png"></a>
</p>

<h2>
	إنشاء مشروع جديد
</h2>

<p>
	من النافذة الرئيسيّة لبيئة التطوير Visual Studio، انقر القائمة <strong>File</strong> من الأعلى، واختر منها <strong>New</strong> ثم <strong>Project</strong> لإنشاء مشروع جديد، ستحصل على النافذة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18847" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig09.png.f5af5090a197d98ce9e96954ed284eb0.png" rel="external"><img alt="fig09.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18847" data-unique="hb6p47c4a" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig09.thumb.png.edbf9d4e0e67d5c699f8555b00225b98.png"></a>
</p>

<p>
	اختر من الشجرة التي تظهر على الجانب الأيسر الخيار: <strong>Cross-Platform</strong> (قد تحتاج لنشر بعض العقد لتصل إليه). ثم اختر نوع المشروع <strong>Blank App Xamarin.Forms) Portable) </strong>من القسم الأوسط للنافذة وذلك من أجل اختيار مكتبة الأصناف المحمولة PCL مع هذا التطبيق. ثمّ أدخل الاسم HelloWorld في حقل الاسم <strong>Name</strong> من الأسفل، ثم انقر <strong>OK</strong>. سيستغرق الأمر وقتًا قليلًا ليعمل Visual Studio على إنشاء عدّة مشاريع ضمن الحل Solution الحالي.
</p>

<p>
	بالنسبة إليّ (أستخدم نظام التشغيل Windows 10) فقد حصلت على خمسة مشاريع ضمن هذا الحل وهي:
</p>

<ul>
<li>
		(HelloWorld (Portable
	</li>
	<li>
		HelloWorld.Droid
	</li>
	<li>
		HelloWorld.iOS
	</li>
	<li>
		(HelloWorld.Windows (Windows 8.1
	</li>
	<li>
		(HelloWorld.WinPhone (Windows Phone 8.1
	</li>
</ul>
<p>
	تظهر هذه المشاريع ضمن مستكشف الحل Solution Explorer في الجانب الأيمن من النافذة (إذا لم يكن ظاهرًا فيمكنك إظهاره من القائمة <strong>View</strong> ثم اختيار <strong>Solution Explorer</strong>). انظر الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18848" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig10.png.50082b49a8b1e923ae5bd37bc69da505.png" rel="external"><img alt="fig10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18848" data-unique="fhjfgtmlm" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig10.thumb.png.afd6c7b882a2c285a3fc7207b65cd643.png"></a>
</p>

<p>
	في الحقيقة لن نهتم في هذه السلسلة سوى بالتطبيقات التي تعمل على أندرويد، لذلك سنحتفظ بالمشروعين (<span style="font-family:courier new,courier,monospace;">HellowWorld</span> (Portable و <span style="font-family:courier new,courier,monospace;">HellowWorld.Droid</span> ونحذف باقي المشاريع. انقر بزر الفأرة الأيمن على المشروع <span style="font-family:courier new,courier,monospace;">HelloWorld.iOS</span> ثم اختر <strong>Remove</strong> لإزالته. كرّر نفس العمليّة بالنسبة للمشروعين (<span style="font-family:courier new,courier,monospace;">HelloWorld.Windows </span>(Windows 8.1 و (<span style="font-family:courier new,courier,monospace;">HelloWorld.WinPhone</span> (Windows Phone 8.1.
</p>

<p>
	<strong>ملاحظة</strong>: قد تختلف المشاريع التي تظهر عندك بشكل طفيف. على أيّة حال احرص على وجود مشروعين فقط وهما <span style="font-family:courier new,courier,monospace;">HelloWorld.Droid</span> و (<span style="font-family:courier new,courier,monospace;">HelloWorld</span> (Portable.
</p>

<h2>
	تشغيل تطبيق أندرويد الأول
</h2>

<p>
	لتشغيل تطبيقات أندرويد فإنّنا نحتاج إلى جهاز ذكي يشغّل أندرويد (بصرف النظر عن الإصدار) أو أن يتوفّر لدينا محاكي Emulator يعمل على محاكاة عمل هذا الجهاز ولكن على حاسوبنا الشخصي.
</p>

<p>
	توفّر مايكروسوفت محاكٍ Emulator خاص بها: Visual Studio Emulator For Android، وذلك لمحاكاة عمل تطبيقات أندرويد على جهاز الحاسوب بدون الحاجة إلى وجود جهاز فيزيائي متصل بالحاسوب. يُعتبر هذا المحاكي برأيي أفضل من المحاكي الافتراضي الذي يأتي مع حزمة التطوير الخاصّة بأندرويد من حيث الأداء. وعلى أية حال، فستحتاج إلى تفعيل ميزة HAXM التي تأتي مع معالجات Intel، والتي يحتاجها المحاكي الافتراضي لتسريع أدائه. انظر إلى هذا الرابط لتعرف المزيد عن هذا الموضوع.
</p>

<p>
	لنشغّل تطبيقنا الأوّل ضمن المحاكي الخاص بمايكروسوفت، سيظهر لك أعلى نافذة بيئة التطوير شريط صغير يحتوي على اسم المحاكي الذي سيتم تشغيله. انظر إلى الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18849" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig11.png.9b0e65954ca50d057afa1c9aacc56bd3.png" rel="external"><img alt="fig11.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18849" data-unique="06utte66v" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig11.thumb.png.78002ad3c4ba4c36007cab6d8c1dfa32.png"></a>
</p>

<p>
	لاحظ بأنّ المحاكي الذي لديّ يدعم الواجهة البرمجيّة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr></abbr> 19 ولا بأس في ذلك. يمكنك دعم أي واجهة برمجيّة ترغبها، باستخدام Android SDK Manager. كلّ ما فعلته أنّني تركت الإعدادات الافتراضيّة كما هي. انقر السهم الأخضر الصغير للتشغيل في وضع التنقيح debugging mode (أو يمكنك اختيار الأمر <strong>Start Debugging</strong> من القائمة <strong>Debug</strong> أو اضغط <span style="font-family:courier new,courier,monospace;">F5</span>). سيستغرق الأمر قليلًا من الوقت حتى تحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18850" href="https://academy.hsoub.com/uploads/monthly_2016_08/fig12.png.64199a4e4b6c76e1e079ede70b585487.png" rel="external"><img alt="fig12.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18850" data-unique="vn76c5syc" src="https://academy.hsoub.com/uploads/monthly_2016_08/fig12.thumb.png.c713e27ef05e5f9d9280177e2df0c6a1.png"></a>
</p>

<p>
	لاحظ الرسالة الترحيبيّة <strong>!Welcome to Xamarin Forms</strong> في وسط الشاشة. مبروك لقد حصلت على برنامجك الأوّل!
</p>

<p>
	أوقف الآن تشغيل البرنامج باختيار الأمر <strong>Stop Debugging </strong>من القائمة <strong>Debug</strong> (أو اضغط <span style="font-family:courier new,courier,monospace;">Shift+F5</span>). انتقل إلى مستكشف الحل Solution Explorer وانشر المشروع (HelloWorld (Portable ثمّ انقر على الملف<span style="font-family:courier new,courier,monospace;"> App.cs </span>وهو الملف الأساسيّ في أيّ تطبيق من تطبيقات Xamarin. ستجد ضمنه الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4887_7">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">
</span><span class="lit">7</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	namespace </span><span class="typ">HelloWorld</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">App</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Application</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	            </span><span class="com">// The root page of your application</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	            </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	                </span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StackLayout</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	                    </span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	                    </span><span class="typ">Children</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	                        </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	                            </span><span class="typ">XAlign</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TextAlignment</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	                            </span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Welcome to Xamarin Forms!"</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	                        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	                    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	            </span><span class="pun">};</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	        </span><span class="kwd">protected</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnStart</span><span class="pun">()</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	            </span><span class="com">// Handle when your app starts</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	        </span><span class="kwd">protected</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnSleep</span><span class="pun">()</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">37</span><span class="pln">	            </span><span class="com">// Handle when your app sleeps</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	
</span><span class="lit">40</span><span class="pln">	        </span><span class="kwd">protected</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnResume</span><span class="pun">()</span><span class="pln">
</span><span class="lit">41</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	            </span><span class="com">// Handle when your app resumes</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	لاحظ الصنف <span style="font-family:courier new,courier,monospace;">App</span> في السطر 10. يرث هذا الصنف من الصنف <span style="font-family:courier new,courier,monospace;">Application</span> الذي يمثّل التطبيق في <span style="font-family:courier new,courier,monospace;">Xamarin.Forms</span>. أيّ تطبيق ننشئه في <span style="font-family:courier new,courier,monospace;">Xamarin.Forms</span> يجب أن يرث من هذا الصنف. تقع بانية الصنف <span style="font-family:courier new,courier,monospace;">App</span> في الأسطر من 12 حتى 28 وفيها يتمّ تعيين الصفحة الرئيسيّة التي سيظهرها التطبيق عند تشغيله. أيّ صفحة من صفحات التطبيق ستكون عبارة عن كائن من صنف يرث من الصنف <span style="font-family:courier new,courier,monospace;">ContentPage</span> (صفحة محتوى). يمكن أن تحتوي هذه الصفحة على أيّ شيء يخطر ببالك من مربّعات النص والأزرار وأشرطة التمرير وغيرها من الأدوات.
</p>

<p>
	لاحظ أنّنا في السطر 15 (ضمن بانية الصنف <span style="font-family:courier new,courier,monospace;">App</span>) قد أسندنا كائنًا جديدًا من الصنف <span style="font-family:courier new,courier,monospace;">ContentPage</span> إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">MainPage</span> وهي خاصيّة تتبع الصنف <span style="font-family:courier new,courier,monospace;">Application</span> (الذي يرث منه الصنف <span style="font-family:courier new,courier,monospace;">App</span>). تستخدم الشيفرة الموجود هنا أسلوب الإنشاء المختصر للكائنات، فكلّ شيء يتمّ هنا من خلال عبارة برمجيّة واحدة. حيث نسند الخصائص للكائنات الجديدة المُنشأة مباشرةً عند إنشاء هذه الكائنات. فمن خلال الشيفرة الموجودة في الأسطر بين 15 و 27 كرّرنا هذا الأسلوب ثلاث مرّات، وذلك من أجل كائنات جديدة من الأصناف <span style="font-family:courier new,courier,monospace;">ContentPage</span> و <span style="font-family:courier new,courier,monospace;">StackLayout</span> و <span style="font-family:courier new,courier,monospace;">Children</span>.
</p>

<h3>
	ملاحظة
</h3>

<p>
	يُعتبر الإسناد المختصر للخصائص عند إنشاء كائنات جديدة، من التقنيّات المهمّة التي تبسّط الشيفرة البرمجيّة إلى حدّ كبير. وكيف تنعش ذاكرتك، إليك المثال البسيط التالي.
</p>

<p>
	بفرض أنّه لدينا الصنف <span style="font-family:courier new,courier,monospace;">Student</span> الذي يحتوي على الخصائص التالية: <span style="font-family:courier new,courier,monospace;">FirstName</span> و <span style="font-family:courier new,courier,monospace;">LastName</span> و <span style="font-family:courier new,courier,monospace;">Age</span>. عند إنشاء كائن جديد من الصنف <span style="font-family:courier new,courier,monospace;">Student</span> يمكننا استخدام العبارة البرمجيّة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4887_9">
<span class="typ">Student</span><span class="pln"> student </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Ahmad"</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Shareef"</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">Age</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">16</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	ففي هذه الحالة ننشئ كائن جديد من الصنف <span style="font-family:courier new,courier,monospace;">Student</span> وبنفس الوقت نُسند القيم المناسبة لخصائصه.
</p>

<p>
	سنؤجّل الحديث عن التوابع <span style="font-family:courier new,courier,monospace;">OnStart</span> و <span style="font-family:courier new,courier,monospace;">OnSleep</span> و <span style="font-family:courier new,courier,monospace;">OnResume</span> لنتحدّث عنها لاحقًا في هذه السلسلة، رغم أنّ أسمائها توحي بوظائفها التي تُعتبر مفيدة ومهمّة في عمل التطبيق.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعلّمنا في هذا الدرس كيفيّة تنزيل وتنصيب Visual Studio 2015 Community مع إضافة قابليّة تطوير تطبيقات لأندرويد باستخدام Xamarin. لاحظ أنّني قد تركت الأمور تسير بشكلها الافتراضيّ قدر المستطاع، لأنّه كما هو واضح هناك العديد من الإجراءات كي تصبح بيئة التطوير جاهزة للعمل، وللبدء بتطوير تطبيقات تعمل على أندرويد وغيره من أنظمة التشغيل باستخدام سي شارب #C و Xamarin.
</p>
]]></description><guid isPermaLink="false">373</guid><pubDate>Tue, 16 Aug 2016 08:33:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x641;&#x64A; &#x645;&#x646;&#x635;&#x629; Xamarin</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D8%A8%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-xamarin-r379/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/xamarin-android-apps.png.0841a2bdc0dde75c3d7af4fbaa9ad629.png" /></p>

<p>
	سنبدأ في هذا الدرس من <a href="https://academy.hsoub.com/search/?tags=xamarin+101" rel="">سلسلة برمجة تطبيقات الأجهزة المحمولة باستخدام Xamarin</a> بالتعرّف على بنية التطبيق ضمن الحل Solution في Visual Studio 2015، بالإضافة إلى إنشائنا لتطبيق بسيط نتعرّف من خلاله على آلية عمل التطبيقات المبنية بواسطة Xamarin والتي تشبه في العديد من الجوانب مثيلاتها المنشأة باستخدام التقنيّات الأساسيّة المعتمدة في إنشاء تطبيقات أندرويد (لغة جافا مع Android Studio).
</p>

<p style="text-align: center;">
	<img alt="xamarin-android-apps.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19229" data-unique="rc388d0p6" src="https://academy.hsoub.com/uploads/monthly_2016_10/xamarin-android-apps.png.df3a3dda27ced2d826b6a1c3d06cbca4.png"></p>

<h2>
	بنية التطبيق المنشأ باستخدام Xamarin
</h2>

<p>
	شغّل برنامج Visual Studio 2015، وبعد ظهور النافذة الرئيسيّة انتقل إلى القائمة <strong>File</strong> ومنها إلى <strong>New</strong> ثم اختر من القائمة الفرعيّة التي ستظهر الخيار <strong>Project</strong>. وكما فعلنا في الدرس السابق، اختر من الجهة اليسرى للنافذة التي ستظهر <strong>Cross-Platform</strong>، ثمّ اختر المشروع <strong>(Blank App (Xamarin.Forms Portable</strong> من القسم الأوسط للنافذة. امنح هذا المشروع الاسم <span style="font-family:courier new,courier,monospace;">SimpleTextApp</span> ثم انقر الزر <strong>OK</strong>.
</p>

<p>
	سنبني تطبيقًا بسيطًا يوضّح كيفيّة استخدام لُصيقة Label وحيدة في إظهار النص في التطبيقات المبنيّة باستخدام Xamarin. من مستكشف الحل Solution Explorer الذي يوجد عادةً في الجهة اليمنى لنافذة بيئة التطوير Visual Studio، أبقِ فقط على المشروعين <span style="font-family:courier new,courier,monospace;">SimpleTextApp.Droid </span>و <span style="font-family:courier new,courier,monospace;">(SimpleTextApp (Portable</span> لأنّنا سنتعامل مع تطبيقات أندرويد فحسب (كما اتفقنا أيضًا من الدرس السابق). احذف باقي المشاريع الإضافيّة، يجب أن تحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19226" href="https://academy.hsoub.com/uploads/monthly_2016_10/fig01.png.5327291e14ca0d137ab49eb696bf6950.png" rel=""><img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19226" data-unique="72n0wvq1b" src="https://academy.hsoub.com/uploads/monthly_2016_10/fig01.thumb.png.3ae926051a435d283c98cef818bdbc2f.png"></a>
</p>

<p>
	يحتوي المشروع (SimpleTextApp (Portable على معظم الشيفرة البرمجيّة، وهذا سلوك عام في المشاريع ذات النمط PCL. حيث تُعتبر الشيفرة الموجودة ضمن المشروع (الذي يحمل المقطع Portable بالإضافة لاسمه) مشتركة لجميع أنواع التطبيقات العاملة على أيّ نظام تشغيل بما فيه أندرويد. نلاحظ الملف App.cs الأساسي الذي سيكون موجودًا في أيّ تطبيق Xamarin وقد تحدثنا عنه في الدرس السابق ورأينا كيف يحتوي على الصنف App الذي يرث من الصنف Application، وكيف أنّ بانية هذا الصنف هي المسؤولة عن إنشاء الصفحة الرئيسيّة للتطبيق. انشر العقدة <strong>References</strong> لترى المراجع الخاصّة بهذا المشروع. ستلاحظ وجود عدّة مكتبات يهمّنا منها: <span style="font-family:courier new,courier,monospace;">Xamarin.Forms.Core </span>و <span style="font-family:courier new,courier,monospace;">Xamarin.Forms.Platform </span>و<span style="font-family:courier new,courier,monospace;"> Xamarin.Forms.Xaml </span>هذه هي المكتبات الرئيسيّة المشكّلة لـ <span style="font-family:courier new,courier,monospace;">Xamarin.Forms</span>.
</p>

<p>
	بالنسبة للمشروع<span style="font-family:courier new,courier,monospace;"> SimpleTextApp.Droid </span>فهو يحتوي على مجلّدين هما: <span style="font-family:courier new,courier,monospace;">Assets</span> و <span style="font-family:courier new,courier,monospace;">Resources</span>. بالنسبة للمجلّد <span style="font-family:courier new,courier,monospace;">Resources</span> فيحتوي على ملفات الصور وملفات معلومات التخطيطات layouts descriptions وغيرها من الملفات التي تُعتبر بمثابة المصادر resources لتطبيقك. انشر المجلّد <span style="font-family:courier new,courier,monospace;">Resources</span> لترى بنيته. أمّا بالنسبة للمجلّد <span style="font-family:courier new,courier,monospace;">Assets</span> فتُوضَع ضمنه الملفات العامّة الأخرى التي ترغب بتضمينها مع تطبيقك. يحتوي هذا المشروع أيضًا على الملف<span style="font-family:courier new,courier,monospace;"> MainActivity.cs</span> الذي يحوي ضمنه صنف له نفس الاسم <span style="font-family:courier new,courier,monospace;">MainActivity</span> وهو يمثّل الفعاليّة <span style="font-family:courier new,courier,monospace;">Activity</span> الأساسيّة لتطبيق أندرويد. افتح هذا الملف لتجد أنّ هذا الصنف يحتوي على التابع <span style="font-family:courier new,courier,monospace;">OnCreate</span> الذي يُنفَّذ عند بدء تشغيل تطبيق أندرويد. لاحظ العبارة البرمجيّة التالية ضمن هذا التابع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_27">
<span class="typ">LoadApplication</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">App</span><span class="pun">());</span></pre>

<p>
	من الواضح أنّها تنشئ كائنًا جديدًا من الصنف <span style="font-family:courier new,courier,monospace;">App</span> الموجود ضمن المشروع (SimpleTextApp (Portable، ثم تمرّره إلى التابع <span style="font-family:courier new,courier,monospace;">LoadApplication</span> مباشرةً ليعمل على تحميل التطبيق وإظهاره للمستخدم. إذًا فعند تشغيل تطبيق أندرويد، سينفّذ التابع <span style="font-family:courier new,courier,monospace;">OnCreate</span> الموجود في الصنف <span style="font-family:courier new,courier,monospace;">MainActivity</span> أولًا، حيث يعمل هذا التابع على إنشاء كائن جديد من الصنف App فينفّذ بانيته وهي المسؤولة عن إنشاء الصفحة الرئيسيّة للتطبيق كما أشرنا. على أيّة حال ستتوضّح الفكرة بشكل جيّد بعد أن نبدأ بكتابة الشيفرة البرمجيّة.
</p>

<h2>
	كتابة الشيفرة البرمجية
</h2>

<p>
	انقر بزر الفأرة الأيمن على اسم المشروع (SimpleTextApp (Portable في مستكشف الحل Solution Explorer لتظهر قائمة سياق، اختر منها <span style="font-family:arial,helvetica,sans-serif;"><strong>Add</strong></span> ثمّ من القائمة الفرعيّة اختر <strong>Class</strong>. ستظهر النافذة الخاصّة بإضافة صنف جديد. من حقل الاسم <strong>Name</strong> من الأسفل اكتب الاسم التالي لهذا الصنف الجديد وهو <span style="font-family:courier new,courier,monospace;">MainPage</span>، ثم انقر <strong>Add</strong>. سيعمل Visual Studio على إضافة ملف جديد إلى المشروع اسمه <span style="font-family:courier new,courier,monospace;">MainPage.cs </span>يحتوي على صنف بنفس اسمه ومحتواه شبيه بما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_7">
<span class="pln">using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Threading</span><span class="pun">.</span><span class="typ">Tasks</span><span class="pun">;</span><span class="pln">

namespace </span><span class="typ">SimpleTextApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لن نحتاج إلى معظم نطاقات الأسماء الموجودة في الشيفرة السابقة في هذا البرنامج، سنحتاج حاليًا إلى نطاق الاسم <span style="font-family:courier new,courier,monospace;">Xamarin.Forms</span>. وسنجعل الصنف <span style="font-family:courier new,courier,monospace;">MainPage</span> يرث من الصنف <span style="font-family:courier new,courier,monospace;">ContentPage</span> كما سنضيف البانية إليه. عدّل الشيفرة السابقة لتصبح على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_9">
<span class="pln">using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

namespace </span><span class="typ">SimpleTextApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pun">()</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّني تخلصت من جميع نطاقات الأسماء غير الضرورية (على أية حال سيظهر أي نطاق اسم غير مُستَخدَم في الشيفرة البرمجيّة بلون باهت في بيئة التطوير Visual Studio 2015). سيلعب الصنف <span style="font-family:courier new,courier,monospace;">MainPage</span> دور صفحة محتوى content page رئيسيّة للتطبيق <span style="font-family:courier new,courier,monospace;">SimpleTextApp</span>. سنضع ضمن بانية هذا الصنف الشيفرة البرمجيّة اللازمة لإنشاء لُصيقة واحدة Label تحوي نصًّا بسيطًا. ثم سنجري بعض التجارب البسيطة على هذه اللُّصيقة. يُعتبر هذا البرنامج بسيطًا في الواقع، ومهمته جعلك أكثر تآلفًا مع Xamarin.
</p>

<p>
	سنبدأ بإنشاء لُصيقة من الصنف Label وذلك ضمن بانية الصنف <span style="font-family:courier new,courier,monospace;">MainPage</span>. تُستخدم اللُصيقات عادةً لعرض النصوص إلى المستخدم. انظر إلى الشيفرة البسيطة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_11">
<span class="typ">Label</span><span class="pln"> lblMain </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pun">();</span><span class="pln">

lblMain</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Welcome to Hsoub Academy!"</span><span class="pun">;</span></pre>

<p>
	ننشئ لُصيقة كما ننشئ أيّ كائن من صنف ما. أنشأنا في الشيفرة السابقة كائنًا جديدًا من الصنف <span style="font-family:courier new,courier,monospace;">Label</span> وأسندناه إلى المتغيّر <span style="font-family:courier new,courier,monospace;">lblMain</span>. ثم أسندنا النص "!Welcome to Hsoub Academy" إلى الخاصيّة Text من المتغيّر <span style="font-family:courier new,courier,monospace;">lblMain</span>. تُستَخدم الخاصية <span style="font-family:courier new,courier,monospace;">Text</span> لضبط وقراءة المحتوى النصيّ للُّصيقة.
</p>

<p>
	كي نستطيع عرض اللُّصيقة السابقة على الصفحة الرئيسيّة للتطبيق، علينا إسناد المتغيّر <span style="font-family:courier new,courier,monospace;">lblMain</span> إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">Content</span> من الصنف <span style="font-family:courier new,courier,monospace;">ContentPage</span>. وبما أنّ الصنف <span style="font-family:courier new,courier,monospace;">MainPage</span> يرث من <span style="font-family:courier new,courier,monospace;">ContentPage</span> فستكون الخاصيّة <span style="font-family:courier new,courier,monospace;">Content</span> موجودة تلقائيًّا ضمنه أيضًا. ستكون عمليّة الإسناد على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_13">
<span class="kwd">this</span><span class="pun">.</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lblMain</span><span class="pun">;</span></pre>

<p>
	تكون عمليّة الإسناد السابقة ممكنة لأنّ الصنف <span style="font-family:courier new,courier,monospace;">Label</span> يرث من الصنف <span style="font-family:courier new,courier,monospace;">View</span> الذي يمثّل واجهة عرض view بمفهومها العام. وبما أنّ الخاصيّة <span style="font-family:courier new,courier,monospace;">Content</span> هي من النوع <span style="font-family:courier new,courier,monospace;">View</span> أيضًا فتكون عمليّة الإسناد هذه ممكنة. ستكون محتويات الملف<span style="font-family:courier new,courier,monospace;"> MainPage.cs</span> شبيهة بما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_15">
<span class="pln">using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

namespace </span><span class="typ">SimpleTextApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pun">:</span><span class="typ">ContentPage</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pun">()</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
			</span><span class="typ">Label</span><span class="pln"> lblMain </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pun">();</span><span class="pln">
			lblMain</span><span class="pun">.</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Welcome to Hsoub Academy!"</span><span class="pun">;</span><span class="pln">

			</span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lblMain</span><span class="pun">;</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	هذا كلّ شيء! علينا الآن القيام بخطوة صغيرة أخيرة، وهي في جعل تطبيقنا يُنشئ كائن من صنفنا الجديد <span style="font-family:courier new,courier,monospace;">MainPage</span> وذلك ضمن الملف <span style="font-family:courier new,courier,monospace;">App.cs</span>. انتقل إلى هذا الملف (موجود ضمن المشروع (SimpleTextApp (Portable واحرص على أن تكون بانية الصنف <span style="font-family:courier new,courier,monospace;">App</span> على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_17">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">App</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">// The root page of your application</span><span class="pln">
	</span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	اضغط الآن المفتاح <span style="font-family:courier new,courier,monospace;">F5</span> لتنفيذ التطبيق، لتحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19227" href="https://academy.hsoub.com/uploads/monthly_2016_10/fig02.png.45125c21116f3fd054b997eec148f168.png" rel=""><img alt="fig02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19227" data-unique="d9p7wgtu0" src="https://academy.hsoub.com/uploads/monthly_2016_10/fig02.thumb.png.4909116efeeca3aae0461679c9ecc8ea.png"></a>
</p>

<h3>
	ملاحظة
</h3>

<p>
	يمكنك وصل جهازك المحمول الذي يعمل بنظام أندرويد إلى الحاسوب لتجريب تشغيل التطبيق عليه مباشرةً. ولكن في هذه الحالة ينبغي أن تتوفّر واجهة برمجيّة <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> منصّبة على حاسوبك مناسبة لنسخة أندرويد الموجودة على الجهاز المحمول. على أية حال يمكنك تنصيب هذه الواجهة في حال عدم وجودها من خلال Android SDK Manager كما أشرنا في الدرس السابق. كما أنصح بوصل الجوال قبل تشغيل بيئة التطوير Visual Studio، أو أن تعيد تشغيلها إذا كانت تعمل من قبل.
</p>

<h2>
	تنسيق الشيفرة البرمجية بشكل أفضل
</h2>

<p>
	في الحقيقة لا تُعتبر الشيفرة البرمجيّة الموجودة ضمن الملف<span style="font-family:courier new,courier,monospace;"> MainPage.cs</span> مثاليّةً رغم بساطتها. ربما لا تشعر بمشكلة الآن، ولكن عندما تصبح برامجك أكبر، ستقع في مشاكل حقيقيّة لأنّ الأسلوب السابق بكتابة الشيفرة يجعلها كبيرة جدًّا. سأستخدم ميّزة الإسناد المباشر للخصائص أثناء إنشاء الكائنات. تفيد هذه الميزة في الاستغناء عن معظم المتغيّرات في البرنامج، التي ينحصر دورها في لعب دور الوسيط المؤقّت. سنعيد صياغة الشيفرة الموجودة في الملف <span style="font-family:courier new,courier,monospace;">MainPage.cs </span>بشكل أنيق وعمليّ أكثر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_19">
<span class="pln">using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

namespace </span><span class="typ">SimpleTextApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pun">()</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
			</span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pun">{</span><span class="pln">
				</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Welcome to Hsoub Academy!"</span><span class="pln">
			</span><span class="pun">};</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنّني استغنيت عن المتغيّر <span style="font-family:courier new,courier,monospace;">lblMain</span> لأنّنا أسندنا كائن اللُّصيقة مباشرةً إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">Content</span>.
</p>

<h2>
	مزايا إضافية على التطبيق
</h2>

<p>
	ستلاحظ من التطبيق السابق أنّ اللُّصيقة تظهر في الزاوية اليسرى العليا من النافذة. سنجعلها تظهر في مركز الشاشة. ينبغي ضبط خاصيّتين من خصائص اللُّصيقة لهذا الغرض، وهما <span style="font-family:courier new,courier,monospace;">HorizontalOptions</span> (لخيارات المحاذاة الأفقيّة) و <span style="font-family:courier new,courier,monospace;">VerticalOptions</span> (لخيارات المحاذاة الرأسيّة). كل من هاتين الخاصيّتين من النوع <span style="font-family:courier new,courier,monospace;">LayoutOptions</span>، وهي بنية struct موجودة ضمن نطاق الاسم<span style="font-family:courier new,courier,monospace;"> Xamarin.Forms</span>. تحتوي هذه البنية على عدّة حقول جاهزة تُفيد في خيارات التموضع الأفقيّة والرأسيّة للُّصيقة، وهي خيارات مهمّة للغاية كما سنرى لاحقًا في هذه السلسلة. لنجري الآن التعديل المطلوب على اللُّصيقة الموجودة ضمن بانية الصنف <span style="font-family:courier new,courier,monospace;">MainPage</span>. ستصبح محتويات الملف <span style="font-family:courier new,courier,monospace;">MainPage.cs </span>على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_21">
<span class="pln">using </span><span class="typ">Xamarin</span><span class="pun">.</span><span class="typ">Forms</span><span class="pun">;</span><span class="pln">

namespace </span><span class="typ">SimpleTextApp</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">ContentPage</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">MainPage</span><span class="pun">()</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
			</span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pun">{</span><span class="pln">
				</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Welcome to Hsoub Academy!"</span><span class="pun">,</span><span class="pln">
				</span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
				</span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pln">
			</span><span class="pun">};</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ إسناد القيمة <span style="font-family:courier new,courier,monospace;">LayoutOptions.Center</span> لكل من الخاصّتين <span style="font-family:courier new,courier,monospace;">HorizontalOptions</span> و <span style="font-family:courier new,courier,monospace;">VerticalOptions</span> وذلك للتوسيط الأفقي والرأسي على الترتيب. نفّذ البرنامج مرّة أخرى ستلاحظ أنّ اللُّصيقة أصبحت في مركز الشاشة كما هو واضح من الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19228" href="https://academy.hsoub.com/uploads/monthly_2016_10/fig03.png.539da3e682d8b03a5616409de7921f73.png" rel=""><img alt="fig03.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19228" data-unique="42peh45cy" src="https://academy.hsoub.com/uploads/monthly_2016_10/fig03.thumb.png.837661e9a96b1f988898b63352142091.png"></a>
</p>

<p>
	أمّا إذا أحببت أن يكون النص ضمن اللُّصيقة بلون آخر، وليكن الأحمر مثلًا، فعليك في هذه الحالة إسناد القيمة<span style="font-family:courier new,courier,monospace;"> Color.Red</span> للخاصيّة <span style="font-family:courier new,courier,monospace;">TextColor</span> لكائن اللُّصيقة، علمًا أنّ <span style="font-family:courier new,courier,monospace;">Color</span> هو بنية موجودة ضمن نطاق الاسم <span style="font-family:courier new,courier,monospace;">Xamarin.Forms</span> أيضًا. انظر كيف نفعل ذلك في الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2340_23">
<span class="kwd">this</span><span class="pun">.</span><span class="typ">Content</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Label</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">Text</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Welcome to Hsoub Academy!"</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">HorizontalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">VerticalOptions</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LayoutOptions</span><span class="pun">.</span><span class="typ">Center</span><span class="pun">,</span><span class="pln">
	</span><span class="typ">TextColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Red</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	نفّذ البرنامج مرّة أخرى، لترى النص وقد أصبح لونه أحمر.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على البنية العامة لتطبيق Xamarin ضمن بيئة التطوير Visual Studio 2015. كما قمنا ببناء تطبيق بسيط للغاية أسميناه <span style="font-family:courier new,courier,monospace;">SimpleTextApp</span>. تنحصر وظيفة هذا التطبيق في التّعرف أكثر على Xamarin. سنبدأ اعتبارًا من الدرس القادم ببناء تطبيقات متدرّجة في الصعوبة، وذات مزايا إضافيّة من الممكن أن تستفيد منها كمبرمج تطبيقات محمولة في حياتك العمليّة.
</p>
]]></description><guid isPermaLink="false">379</guid><pubDate>Sun, 14 Aug 2016 07:34:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x645;&#x646;&#x635;&#x629; &#x62A;&#x637;&#x648;&#x64A;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x623;&#x62C;&#x647;&#x632;&#x629; &#x627;&#x644;&#x645;&#x62D;&#x645;&#x648;&#x644;&#x629;&#xA0;Xamarin</title><link>https://academy.hsoub.com/programming/c-sharp/xamarin/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%85%D9%88%D9%84%D8%A9%C2%A0xamarin-r369/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_07/xamarin-introduction.png.40068e3e724487fb3cd610b7f2607df8.png" /></p>

<p>
	تُعتبر منصّة Xamarin في الوقت الحالي، من أهمّ منصّات تطوير تطبيقات الأجهزة المحمولة المتوفّرة، والتي يبدو أنّها ستبقى على الواجهة لوقت ليس بالقليل، خصوصًا بعد استحواذ شركة مايكروسوفت على الشركة المنتجة لها والتي تحمل أيضًا نفس الاسم (Xamarin). قد تكون متحفّزًا للدخول في عالم تطوير تطبيقات الأجهزة المحمولة (كما كنت عندما تعرّفت للمرّة الأولى على Xamarin) ومستعدًّا لكتابة الشيفرة مباشرةً، ولكن لنصبر قليلًا، ولنفهم بدايات الأمور، ومبدأ عمل Xamarin بشكل أفضل ضمن هذا المقال، الذي يُعدّ الأوّل في سلسلة مقالات سترشدك إلى كيفيّة تطوير تطبيقات باستخدام منصّة Xamarin مع إنشاء تطبيقات عمليّة من خلالها.
</p>

<p style="text-align: center;">
	<img alt="xamarin-introduction.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18588" data-unique="ntbmq1zxr" src="https://academy.hsoub.com/uploads/monthly_2016_07/xamarin-introduction.png.f67fcfc5760fbf05264c1ce662a25aa5.png"></p>

<h2>
	مقدمة
</h2>

<p>
	تمّ تأسيس شركة Xamarin (وتُقرأ زامارين) في عام 2011، من قِبَل نفس المهندسين الذين صمّموا <a href="http://www.mono-project.org/" rel="external nofollow">مشروع Mono</a>. ومشروع Mono وإخوانه مثل Mono for android و Mono Touch، هي عبارة عن منصّات لتشغيل تطبيقات مكتوبة بلغة سي شارب C# على أنظمة التشغيل: Linux و Android و iOS على الترتيب. يمكن باستخدام Xamarin إنشاء تطبيقات أصليّة Native Apps لأجهزة Android و iOS و Mac وويندوز بلغة برمجة ليست معتمدة رسميًا بالنسبة إليها. سنركّز في هذه السلسلة على بناء تطبيقات تعمل على نظام التشغيل Android.
</p>

<h2>
	لمن هذه السلسلة؟
</h2>

<p>
	إذا كان لديك إلمام جيّد بلغة سي شارب ومكتبة الأصناف الأساسيّة BCL ضمن إطار العمل دوت نت بالإضافة إلى معرفة أوليّة بطريقة استخدام بيئة التطوير Visual Studio 2015، وتمتلك الشغف والصبر لتعلّم كيفيّة برمجة تطبيقات للأجهزة المحمولة باستخدام Xamarin فإنّ هذه السلسلة هي بالتأكيد لك. لدينا هنا في أكاديميّة حسوب <a href="https://academy.hsoub.com/search/?tags=%D8%AA%D8%B9%D9%84%D9%85+%D8%B3%D9%8A+%D8%B4%D8%A7%D8%B1%D8%A8" rel="">سلسلة تعليميّة خاصّة بلغة سي شارب</a> يمكن الاستفادة منها.
</p>

<h2>
	الحاجة إلى Xamarin
</h2>

<p>
	برزت الحاجة إلى Xamarin بسبب طبيعة تطبيقات الأجهزة المحمولة وعملها على أنظمة تشغيل مختلفة تعود إلى شركات متنافسة. توجد في الوقت الحالي ثلاثة أنظمة تشغيل مسيطرة على السوق بصورة متفاوتة وهي: iOS لشركة Apple وAndroid لشركة Google وWindows Phone لشركة Microsoft. تختلف هذه الأنظمة في العديد من النواحي، التي سنناقشها فيما يلي.
</p>

<h3>
	تجربة المستخدم
</h3>

<p>
	بالنسبة إلى تجربة المستخدم يوجد تشابه في هذه الأنظمة من ناحية تقديم الواجهات الرسوميّة للمستخدم والتفاعل مع الجهاز من خلال اللمس أو اللمس المتعدّد، ولكنّ هناك اختلافات في التفاصيل. فلكلّ نظام تشغيل وسائل مختلفة في التنقّل بين صفحات التطبيق، وفي تقديم البيانات، وفي العمل مع القوائم، وغيرها من التفاصيل الأخرى التي تتطلّب أن يسلك المطوّر developer منحىً مختلفًا من أجل كلّ نظام تشغيل.
</p>

<h3>
	بيئات تطوير ولغات برمجة مختلفة
</h3>

<p>
	أمّا بالنسبة للغات البرمجة وبيئات التطوير، فهذا أمر آخر. فلكلّ نظام تشغيل متطلّباته الخاصّة التي ألخّصها بشكل سريع فيما يلي:
</p>

<ul>
<li>
		لإنشاء تطبيقات على أنظمة iOS فأنت تحتاج إلى إتقان لغة البرمجة Objective-C أو لغة البرمجة Swift. وأن تمتلك حاسوب MacBook (أي إصدار) مع بيئة التطوير Xcode.
	</li>
	<li>
		لإنشاء تطبيقات على أنظمة Android فستحتاج إلى لغة جافا Java مع بيئة التطوير Android Studio التي تعمل على العديد من أنظمة التشغيل.
	</li>
	<li>
		أمّا لإنشاء تطبيقات تعمل على Windows Phone أو Windows 10 Mobile فأنت بحاجة إلى لغة البرمجة سي شارب C# مع حاسوب يشغّل ويندوز، وإلى بيئة التطوير Visual Studio.
	</li>
</ul>
<h3>
	واجهات برمجية مختلفة
</h3>

<p>
	تعتمد جميع أنظمة التشغيل السابقة على واجهات تطبيق برمجيّة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr> مختلفة. مع أنّه يوجد بعض الشبه بالنسبة للكائنات المتعلّقة بواجهة المستخدم user-interface. فعلى سبيل المثال، جميع الأنظمة السابقة توفّر وسيلة للمستخدم لاختيار حالة منطقيّة Boolean والتي يمكن تمثيلها بـ True أو False ففي iOS يصنّف هذا الكائن على أنّه view اسمه UISwitch، أمّا في أندرويد فهو widget اسمها Switch، وفي ويندوز فهو control ويسمّى ToggleSwitch.
</p>

<h2>
	الحل الذي توفره Xamarin
</h2>

<p>
	يمكن تجاوز جميع النقاط السابقة من خلال Xamarin لأنّها توفّر لغة برمجة وحيدة وهي سي شارب يمكن استخدامها لكتابة تطبيقات على أيّ نظام تشغيل. كما أنّها توفّر بيئة تطوير متقدّمة ووحيدة وهي Visual Studio 2015 لكتابة هذه التطبيقات (يمكن استخدام بيئة التطوير Xamarin Studio أيضًا بالنسبة لنظام Mac). بالإضافة إلى أنّها وحّدت الواجهات البرمجيّة المختلفة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr> ضمن واجهة برمجيّة وحيدة يتعامل معها المطوّر.
</p>

<p>
	لغة سي شارب غنيّة عن التعريف. فهي لغة قويّة ومرنة وغنيّة جدًا ودائمة التطوير. لقد أصبحت بحق من أكثر لغات البرمجة تطوّرًا وحداثةً. ولسنا هنا بصدد تفضيل لغة برمجة على أخرى، ولكن بحسب خبرتي الشخصيّة، واطّلاعي على العديد من لغات البرمجة الأخرى، تستطيع القول بأنّ سي شارب تحتلّ موقعًا مرموقًا بينها.
</p>

<p>
	يستطيع المطوّرون من أجل تطبيق محدّد، كتابة شيفرة واحدة مشتركة لجميع أنظمة التشغيل السابقة بدون أيّة تعديلات تُذكر عليها فيما يتعلّق بمنطق العمل business logic داخل التطبيق وبما يتضمنّه من عمليّات برمجيّة لا تتعلّق بنوع الجهاز المحمول أو نظام التشغيل الذي يعمل عليه. نسمّي هذه الشيفرة بالشيفرة المستقلة عن نظام التشغيل platform independent. أمّا إذا تطلّب الأمر من التطبيق أن يتعامل مع العتاد الصلب للجهاز الذي يعمل عليه (مثل الكاميرا أو حسّاس GPS مثلًا)، فيمكن عندها كتابة أجزاء من الشيفرة التي تراعي خصوصيّة كل نظام تشغيل، نسمّي مثل هذه الشيفرة بالشيفرة المرتبطة بنظام التشغيل platform dependent.
</p>

<h2>
	المكونات الرئيسية لمنصة Xamarin
</h2>

<p>
	ركّزت شركة Xamarin منذ نشأتها على التكنولوجيا الخاصّة بالمترجمات Compilers. وقد أصدرت الشركة ثلاث مجموعات أساسيّة من مكتبات دوت نت .NET وهي: Xamarin.Mac و Xamarin.iOS و Xamarin.Andorid التي تشكّل بمجموعها منصّة Xamarin. تسمح هذه المكتبات للمطوّرين بكتابة تطبيقات أصليّة native apps لكلّ من أنظمة التشغيل الموافقة.
</p>

<p>
	ذكرنا قبل قليل أنّ هناك جزء من شيفرة التطبيق البرمجيّة يتكرّر عادةً من أجل كل نظام تشغيل، يمكن عزل هذا الجزء ووضعه ضمن مشروع منفصل في برنامج Visual Studio. لهذا المشروع نوعين:
</p>

<ul>
<li>
		مشروع الأصول المشتركة Shared Asset Project أو اختصارًا SAP. وهو عبارة عن مجموعة من ملفات الشيفرة بالإضافة إلى ملفّات الأصول assets مثل الصور وغيرها الموجودة ضمن المشروع والتي يمكن مشاركتها مع باقي المشاريع الأخرى ضمن نفس الحل Solution في Visual Studio.
	</li>
	<li>
		مكتبة الأصناف المحمولة Portable Class Library أو اختصارًا PCL. وهي تضمّ الشيفرة التي نرغب بمشاركتها وذلك ضمن مكتبة ربط ديناميكي dynamic link library أو اختصارًا DLL. سنركّز في هذه السلسلة على هذا النوع.
	</li>
</ul>
<p>
	أمّا بالنسبة للشيفرة التي تتعلّق بنظام التشغيل، فتوضع ضمن مشروع منفصل ضمن Visual Studio لكلّ نظام تشغيل نرغب بأن ندعمه. ففي الحالة العامّة، يمكن أن يكون لدينا ثلاثة مشاريع منفصلة لكل من Android و iOS و Windows Phone. تستفيد جميعها من الشيفرة المشتركة والمستقلّة عن نظام التشغيل الموجودة في PCL أو SAP. وبالمجمل تكون جميع تلك المشاريع ضمن نفس الحل Solution ضمن Visual Studio. انظر إلى الشكل التالي الذي يوضّح كيفيّة تفاعل التطبيق المكتوب لأنظمة التشغيل المختلفة مع مكوّنات Xamarin:
</p>

<p style="text-align: center;">
	<img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18586" data-unique="53x13td0b" src="https://academy.hsoub.com/uploads/monthly_2016_07/fig01.png.22361fc5900128de0d59c0cfc8912207.png"></p>

<p>
	يمثّل الشكل السابق تطبيقًا واحدًا. نلاحظ في السطر الثاني الأشكال المختلفة لهذا التطبيق على أنظمة التشغيل المختلفة. انظر كيف تتفاعل هذه الأشكال المختلفة مع مشروع PCL أو SAP للاستفادة من الشيفرة المشتركة التي لا تتعلّق بنظام تشغيل محدّد. انظر إلى تطبيق iOS مثلًا كيف يتفاعل أيضًا مع المكتبة Xamarin.iOS التي توفّر وسيلة للربط bindings بينه وبين واجهة التطبيقات البرمجيّة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr> لنظام التشغيل iOS. ينطبق نفس الأمر تماماً بالنسبة لتطبيق أندرويد. الاستثناء الوحيد هو بالنسبة لتطبيق ويندوز الذي لا يحتاج إلى وسيط (وسيلة للربط) في هذه الحالة، حيث يمكنه الاتصال مباشرةً مع واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr> لنظام التشغيل ويندوز (بصورة أدق Windows Phone).
</p>

<h2>
	نماذج Xamarin
</h2>

<p>
	ابتكرت شركة Xamarin في عام 2014 ما يُعرف بنماذج Xamarin أو Xamarin Forms. تسمح هذه المنصّة للمطوّرين بأن يكتبوا شيفرة برمجيّة لواجهة المستخدم user interface بحيث يمكن تحويل هذه الشيفرة مباشرةً إلى تطبيقات تعمل على أجهزة أندرويد و iOS وويندوز. في الحقيقة أصبحت Xamarin Forms تدعم إنشاء تطبيقات عامّة Universal Windows Platform على الأجهزة التي تشغّل نسخ ويندوز المختلفة مثل Windows Phone و Windows 10 و Windows 10 Mobile و Windows 8.1 و Windows 8.1 Phone.
</p>

<p>
	بالنسبة لبنية الحل Solution في Visual Studio فلن يتغيّر كثيرًا، باستثناء أنّ المشاريع المنفصلة الخاصّة بأنظمة التشغيل السابقة ستكون صغيرة على نحو ملحوظ بسبب وجود كميّة قليلة من الشيفرة البرمجيّة ضمنها. سيتضمّن مشروع PCL أو SAP في هذه الحالة الشيفرة المشتركة والمستقلّة عن أنظمة التشغيل كما اتفقنا على ذلك من قبل، بالإضافة إلى الشيفرة البرمجيّة المسؤولة عن الإظهار والتعامل مع واجهة المستخدم. أي أنّ منصّة Xamarin Forms تسمح لنا بكتابة شيفرة برمجيّة واحدة تعمل مباشرةً على أنظمة التشغيل المختلفة. انظر الشكل التالي لفهم آليّة عمل التطبيقات التي تعتمد Xamarin Forms.
</p>

<p>
	تعتمد التطبيقات المكتوبة لأنظمة التشغيل المختلفة في هذه الحالة على مشروع PCL أو SAP بشكل كليّ في التواصل مع الواجهات البرمجيّة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr></abbr>. وهكذا من الممكن في الكثير من التطبيقات كتابة شيفرة واحدة فقط تعمل على جميع الأجهزة! باستثناء الحالات التي يكون من الضروري فيها كتابة شيفرة مخصّصة لنظام تشغيل محدّد. في المستقبل قد يتغيّر هذا الأمر، فقد يكون من الممكن كتابة شيفرة واحدة فقط تعمل على جميع الأجهزة مهما كان نوع هذه الشيفرة. سنتحدّث في هذه السلسلة عن Xamarin Forms بشكل أساسيّ.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18587" href="https://academy.hsoub.com/uploads/monthly_2016_07/fig02.png.c5d17294aa15dd555a5c6c05837c7d72.png" rel="external"><img alt="fig02.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18587" data-unique="rd48qjkmz" src="https://academy.hsoub.com/uploads/monthly_2016_07/fig02.thumb.png.74c1bb68224b5504e875ff648f9b072b.png"></a>
</p>

<h2>
	كيفية عمل Xamarin
</h2>

<p>
	بالنسبة لتطبيقات iOS فيعمل مترجم سي شارب الخاص بـ Xamarin على ترجمة الشيفرة البرمجيّة إلى لغة مايكروسوفت الوسيطيّة MSIL، ثمّ يُستخدم مترجم Apple على نظام تشغيل Mac لتوليد رُماز أصليّ native code يعمل على iOS كما لو أنّه تطبيق مكتوب بلغة Objective-C تمامًا.
</p>

<p>
	أمّا بالنسبة لتطبيقات Android، فسيولّد المترجم أيضًا لغة MSIL التي ستعمل في هذه الحالة على بيئة تنفيذ مشتركة CLR مخصّصة للعمل على أندرويد. وستكون التطبيقات الناتجة في هذه الحالة تشبه أيضًا إلى حدّ كبير تلك المنشأة باستخدام لغة جافا وبيئة التطوير Android Studio الخاصّة بأندرويد.
</p>

<p>
	وأخيرًا بالنسبة للتطبيقات التي تعمل على Windows Phone و Windows 10 Mobile، فالتطبيقات مدعومة بشكل واضح، وستعمل كالتطبيقات الأصليّة المنشأة باستخدام Visual Studio بدون استخدام Xamarin.
</p>

<h2>
	الخلاصة
</h2>

<p>
	منصّة Xamarin واعدة، ولها تاريخ عريق وتجارب غنيّة من قبل أن تظهر شركة Xamarin إلى الوجود. ولعلّ مايكروسوفت قد أدركت الأهميّة الكبيرة لها، فتمّت عمليّة الاستحواذ التي كانت متوقعّة. أنصحك بأن تبادر إلى تعلّم Xamarin وخصوصًا في حال كنت مبرمج سي شارب، أو لديك معلومات أوليّة عنها. ولعلّ الأيّام القادمة قد تحمل المزيد من الدعم والمفاجآت لمنصّة Xamarin التي كان أوّلها هو جعلها مجّانيّة للاستخدام الشخصيّ أو للفرق البرمجيّة الصغيرة. سنبدأ اعتبارًا من الدرس القادم في هذه السلسلة التعليميّة، تنصيب برنامج Visual Studio 2015 وبدء العمل مع Xamarin.
</p>
]]></description><guid isPermaLink="false">369</guid><pubDate>Wed, 27 Jul 2016 07:26:00 +0000</pubDate></item></channel></rss>
