في الجزء الأول ، قمنا بالقاء نظرة سريعة على عملية التخطيط (Layout) في WPF وشرحنا طريقة استخدام احد الألواح هو الـ StackPanel، بإذنه تعالى ، في هذا الجزء سوف نحاول ان نكمل شرح بقية الألواح.
استخدام WrapPanel:
يقوم اللوح WrapPanel بترتيب العناصر في صفوف او اسطر افقية او رأسية . فيتم ملئ السطر الأول ثم السطر الثاني وهكذا.
واتجاه الترتيب يتم تحديده بواسطة الخاصية Orientation التي تكون قيمتها Horizontal بشكل افتراضي ويمكن تغييرها إلى القيمة Vertical
مثال :
<WrapPanel> <Button>Button 1</Button> <Button>Button 2</Button> <Button>Button 3</Button> <Button>Button 4</Button> <Button>Button 5</Button> </WrapPanel>
النتيجة:
لاحظ كيف يتغير ترتيب العناصر عند تكبير وتصغير النافذة
لنأخذ مثالا آخر ، مع التغيير في بعض خصائص العناصر.
مثال :
<Window x:Class="LayoutPanels.WrapPanelExample2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WrapPanelExample2" Height="300" Width="300"> <WrapPanel Margin="3"> <Button VerticalAlignment="Top">Top Button</Button> <Button MinHeight="60">Tall Button 2</Button> <Button VerticalAlignment="Bottom">Bottom Button</Button> <Button>Stretch Button</Button> <Button VerticalAlignment="Center">Centered Button</Button> </WrapPanel> </Window>
النتيجة:
كما هو مبين اعلاه، يكون ارتفاع كل صف بارتفاع العنصر الأكبر بداخله.
استخدام DockPanel
في الكثير من التطبيقات (مثل وورد، اكسل ...الخ) نجد شريط الأدوات قد تم رصفه في اعلى النافذة ، بينما شريط الحالة في اسفل النافذة. في WPF يمكننا عمل مثل هذا التخطيط عن طريق DockPanel التي تقوم برصف العناصر إلى اي جانب من جوانب النافذة ، وتحديد الجانب المطلوب يتم عن طريق الخاصية المرفقة DockPanel.Dock التي يمكن ان تأخذ قيمة من القيم التالية (Left، Top، Right، Bottom) .
المثال التالي يقوم بوضع زر على كل جانب :
<Window x:Class="LayoutPanels.DockPanelExample1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DockPanelExample1" Height="300" Width="300"> <DockPanel> <Button DockPanel.Dock="Top">الزر - اعلى</Button> <Button DockPanel.Dock="Bottom">الزر-اسفل</Button> <Button DockPanel.Dock="Left">الزر- يسار</Button> <Button DockPanel.Dock="Right">الزر- يمين</Button> <Button>المساحة المتبقية</Button> </DockPanel> </Window>
النتيجة:
لاحظ ان المساحة المتبقية قد تم اعطائها للزر الأخير وهذا بسبب ان الخاصية LastChildFill في DockPanel تكون قيمتها True بشكل افتراضي- ويمكنك تغيير قيمتها إذا لم يكن هذا مناسب بالنسبة لك.
تذكر ايضاً ان ترتيب العناصر يلعب دورا هاما عند التعامل مع DockPanel، فلو عدنا إلى المثال السابق ، سوف نجد ان الزرين الأعلى والأسفل قد احتل كل منهما المساحة الكاملة من الجانب المطلوب.بينما الزرين الأيمن والأيسر قد شغلا المساحة المتبقية من الجانب. وسبب هذا اننا وضعنا الزرين الأعلى والأسفل قبل الزرين الأيمن والأيسر. والنتيجة سوف تتغير عندما نقوم بتغيير الترتيب بحيث نضع الزرين الأيمن والأيسر اولاً:
يمكننا ايضاً رصف اكثر من عنصر في نفس الجانب ، وتحديد الهامش او المحاذاة سواء الأفقية او الرأسية لأي عنصر:
<Window x:Class="LayoutPanels.DockPanelExample2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DockPanelExample2" Height="300" Width="300"> <DockPanel LastChildFill="True"> <Button DockPanel.Dock="Top">زر- اعلى - ممتد</Button> <Button DockPanel.Dock="Top" HorizontalAlignment="Center"> زر- اعلى- توسيط</Button> <Button DockPanel.Dock="Top" HorizontalAlignment="Left"> زر-اعلى- محاذي لليسار</Button> <Button DockPanel.Dock="Bottom">زر- اسفل</Button> <Button DockPanel.Dock="Left">زر-يسار</Button> <Button DockPanel.Dock="Right">زر- يمين</Button> <Button>المساحة المتبقية</Button> </DockPanel> </Window>