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

لماذا نحتاج إلى أساليب في إطار أفالونيا؟
- تعطي الأنماط حرية أكبر عند تخصيص العناصر ؛
- لا تكرر وصف العنصر ؛
- افصل بين العلامات نفسها وتصميمها.
بضعة أمثلة
لفهم الأنماط بشكل أفضل ، انظر أولاً إلى مثال:
زر مدور (شيء مشابه لجونوم أوبونتو)
للقيام بذلك ، قم بإنشاء تخطيط بسيط من مكدس اللوحة واثنين من الأزرار في القالب القياسي (
كيفية إنشاء قالب ).
<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>
مثال آخر مثير للاهتماميشبه مربع الاختيار القياسي هذا:

مربع الاختيار المحسن يشبه نظام Android (قليلاً)

قليلا من السحر <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 وتقديم الدعم لملفاتنا المستقبلية كمورد avaloina:
<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 Style Tutorial (
هنا )
يمكنك الحصول على أفكار أساسية حول كيفية كتابة نمط لعنصر هنا (
هنا )
وإذا لم يكن لديك الوقت / الرغبة في إنشاء أسلوبك الخاص ، فيمكنك استخدام هذا المولد الرائع (
هنا )

أود أن أقول شكرا
ForNeVeR kekekeks worldbeater