أنيق أفالونيا

تكون الأنماط ، بشكل افتراضي ، في wpf ، الموجودة في Avalonia ، محايدة للغاية ، وهي ليست مناسبة دائمًا للمهام التي نحتاجها ، وعدد قليل من مطوري المبتدئين هم أصدقاء لهم. في هذه المقالة ، أود أن أتحدث عن أساسيات العمل مع الأنماط وإظهار بعض الأمثلة المثيرة للاهتمام.



لماذا نحتاج إلى أساليب في إطار أفالونيا؟

  1. تعطي الأنماط حرية أكبر عند تخصيص العناصر ؛
  2. لا تسمح لتكرار أوصاف العناصر ؛
  3. افصل بين العلامات نفسها وتصميمها.

بضعة أمثلة


لفهم الأنماط بشكل أفضل ، انظر أولاً إلى مثال:

زر مدور (شيء مثل جنوم أوبونتو)
للقيام بذلك ، سننشئ في القالب القياسي ( كيفية إنشاء قالب ) علامة بسيطة من مكدس اللوحة واثنين من الأزرار.

<StackPanel> <Button Margin="20" Content="Btn" /> <Button Margin="20" Content="Style Btn" /> </StackPanel> 

الآن يمكننا التعامل مع الأزرار مع الخلفية الرئيسية ولون الخط ، ولكن بعد ذلك سيتعين علينا تكرار الكود. سوف يساعد نمط تجنب هذا التكرار.

أضف النمط المناسب إلى النافذة:

  <Window.Styles> <Style Selector="Button"> <Setter Property="Foreground" Value="#FFFFFFFF" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Background" Value="#FFDD4812" /> <Setter Property="BorderBrush" Value="#FFFFFFFF" /> </Style> </Window.Styles> 



نحصل على شيء مماثل ، لكن سيكون من الجيد تقريب الحواف. لسوء الحظ ، بغض النظر عن الطريقة التي نحاول بها ، فمن المستحيل تقريب حواف الزر ، لكن يمكنك تقريب حواف القالب المسؤول عن عرض الزر. للقيام بذلك ، أضف نمطًا آخر:

 <Style Selector="Button /template/ ContentPresenter"> <Setter Property="CornerRadius" Value="10" /> </Style> 



لقد بدا الأمر مشابهاً تقريبًا ، ولكن هناك مشكلة - عند التمرير بالماوس فوق الزر ، يظهر إطار رمادي (مرحبًا من النمط القياسي).



للقيام بذلك ، انتقل إلى css : pointerover-pseudo-class وأضف نمطًا آخر:

  <Style Selector="Button:pointerover /template/ ContentPresenter"> <Setter Property="BorderBrush" Value="#FFDD4812" /> </Style> 



أفضل بكثير.

ولكن ماذا لو كنت أرغب في تطبيق الأنماط فقط على أزرار معينة؟

أضف زرًا واحدًا إلى القالب والكتابة إلى الأزرار التي نريد "تزيين" سمة الفصول الدراسية بها .

  <StackPanel> <Button Margin="20" Content="Btn" /> <Button Margin="20" Classes="btn" Content="Style Btn" /> <Button Margin="20" Classes="btn" Content="Style Btn" /> </StackPanel> 

وسنشير إلى الأنماط التي نحتاج إليها للتأثير على فئات معينة فقط:

 <Style Selector="Button.btn /template/ ContentPresenter"> <Setter Property="CornerRadius" Value="10" /> </Style> <Style Selector="Button.btn"> <Setter Property="Foreground" Value="#FFFFFFFF" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Background" Value="#FFDD4812" /> <Setter Property="BorderBrush" Value="#FFFFFFFF" /> </Style> <Style Selector="Button:pointerover.btn /template/ ContentPresenter"> <Setter Property="BorderBrush" Value="#FFDD4812" /> </Style> 



كل رمز النافذة
 <Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:Wind1.ViewModels;assembly=Wind1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Wind1.Views.MainWindow" Icon="/Assets/avalonia-logo.ico" Title="Wind1"> <Window.Styles> <Style Selector="Button.btn /template/ ContentPresenter"> <Setter Property="CornerRadius" Value="10" /> </Style> <Style Selector="Button.btn"> <Setter Property="Foreground" Value="#FFFFFFFF" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Background" Value="#FFDD4812" /> <Setter Property="BorderBrush" Value="#FFFFFFFF" /> </Style> <Style Selector="Button:pointerover.btn /template/ ContentPresenter"> <Setter Property="BorderBrush" Value="#FFDD4812" /> </Style> </Window.Styles> <StackPanel> <Button Margin="20" Content="Btn" /> <Button Margin="20" Classes="btn" Content="Style Btn" /> <Button Margin="20" Classes="btn" Content="Style Btn" /> </StackPanel> </Window> 


مثال آخر مثير للاهتمام
يشبه مربع الاختيار القياسي هذا:



تحسن قليلا يشبه الروبوت (قليلا)



بعض السحر
 <Window.Styles> <Style Selector="CheckBox.uberbox"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> <Grid> <Border Background="#b0b0b0" Padding="5" BorderBrush="#303030" CornerRadius="5"> <Grid> <Grid Classes="unchecked" ColumnDefinitions=" Auto, Auto"> <Border Width="20" Height="20" Background="Blue" CornerRadius="5" /> <TextBlock FontWeight="Bold" Margin="5,0,0,0" Grid.Column="1">0FF </TextBlock> </Grid> <Grid Classes="checked" ColumnDefinitions=" Auto, Auto"> <Border Grid.Column="1" Width="20" Height="20" Background="Red" CornerRadius="5" /> <TextBlock FontWeight="Bold" Margin="0,0,5,0"> ON </TextBlock> </Grid> </Grid> </Border> <Border Classes="fade" Background="White" CornerRadius="5" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style Selector="CheckBox.uberbox /template/ Grid.checked"> <Setter Property="Opacity" Value="0" /> </Style> <Style Selector="CheckBox.uberbox:checked /template/ Grid.checked"> <Setter Property="Opacity" Value="1" /> </Style> <Style Selector="CheckBox.uberbox:checked /template/ Grid.unchecked"> <Setter Property="Opacity" Value="0" /> </Style> <Style Selector="CheckBox.uberbox /template/ Border.fade"> <Setter Property="Opacity" Value="0" /> </Style> <Style Selector="CheckBox.uberbox:pointerover /template/ Border.fade"> <Setter Property="Opacity" Value="0.2" /> </Style> </Window.Styles> <StackPanel> <CheckBox Classes="uberbox" Margin="10" /> </StackPanel> 



حيث لاستخدام الأنماط


يمكن استخدام الأنماط داخل النافذة (كما فعلنا في الأمثلة المكتوبة أعلاه) ،
وداخل التطبيق بالكامل (ثم سيتم تطبيق النمط في جميع النوافذ).

للقيام بذلك ، أضف النمط إلى ملف App.xaml.

  <Application.Styles> <StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml"/> <StyleInclude Source="avares://Avalonia.Themes.Default/Accents/BaseLight.xaml"/> <Style Selector="Button"> <Setter Property="Background" Value="Blue"></Setter> </Style> </Application.Styles> 

فصل أكبر


مع تعقيد الشفرة ، لم نعد نريد الاحتفاظ بالأنماط داخل تخطيط النافذة ، لكننا نفضل وضعها في ملف منفصل:



للقيام بذلك ، قم بإنشاء دليل الأنماط ووضع الأنماط لدينا في شكل ملفات xml أو xaml ، مضيفًا إرشادات مساحة الاسم:

 <Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> <Style Selector="Button /template/ ContentPresenter"> <Setter Property="CornerRadius" Value="10" /> </Style> <Style Selector="Button"> <Setter Property="Foreground" Value="#FFFFFFFF" /> <Setter Property="BorderThickness" Value="2" /> <Setter Property="Background" Value="#FFDD4812" /> <Setter Property="BorderBrush" Value="#FFFFFFFF" /> </Style> <Style Selector="Button:pointerover /template/ ContentPresenter"> <Setter Property="BorderBrush" Value="#FFDD4812" /> </Style> </Styles> 

أضف موارد جديدة إلى ملف المشروع (* .csproj):

  <AvaloniaResource Include="Styles\**" /> 

وقم بتوصيلها باستخدام علامة StyleInclude

 <Window.Styles> <StyleInclude Source="/Styles/Style.xml"/> </Window.Styles> 

لكن هذا في بعض الأحيان لا يكفي ، وأريد أن أضع الأنماط في ملف منفصل لاستخدامه في جميع المشاريع.

للقيام بذلك ، قم بإنشاء مكتبة ClassLibrary وتقديم الدعم لملفاتنا المستقبلية كمصدر avaloniya:

  <ItemGroup> <AvaloniaResource Include="**\*.xaml"> <SubType>Designer</SubType> </AvaloniaResource> </ItemGroup> <ItemGroup> <AvaloniaResource Include="**\*.xml"> <SubType>Designer</SubType> </AvaloniaResource> </ItemGroup> 

أضف الآن Styles.xml المألوفة وملفين جديدين آخرين إلى المشروع:



في ملف xaml ، يجب عليك تحديد مساحة الاسم والفئة التي ينتمي إليها ، بالإضافة إلى اتصال المورد الضروري:

 <Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ClassLibrary1.DarkCustom"> <StyleInclude Source="avares://ClassLibrary1/Style.xml"/> </Styles> 

وفي ملف cs ، نعرّف أن هذا أسلوب وليس أكثر:

 namespace ClassLibrary1 { public class DarkCustom:Styles { } } 

أضف تبعية إلى مكتبتنا وأعد توصيل النمط ، وحدد النمط كمورد أفالونيا باستخدام StyleInclude و

  <Window.Styles> <StyleInclude Source="avares://ClassLibrary1/DarkCustom.xaml"/> </Window.Styles> 

بعض أكثر فائدة


تأكد من إطلاعك على البرنامج التعليمي الرسمي لأسلوب Avalonia ( tyk )
يمكنك الحصول على أفكار أساسية حول كيفية كتابة نمط لهذا العنصر أو ذاك هنا ( tyk )
وإذا لم يكن لديك الوقت / الرغبة في إنشاء أسلوبك الخاص ، فيمكنك استخدام مولد الأنماط الرائع هذا ( tyk )



أود أن أقول شكراً لـ WorldNeater ForNeVer

ولاحظ أنه يمكن العثور على الدعم لـ c # هنا ، ولأفاليا هنا .

Source: https://habr.com/ru/post/ar471046/


All Articles