स्टाइलिश अवलोनिया

शैलियाँ, डिफ़ॉल्ट रूप से, wpf में, कि अवलोनिया में, बेहद तटस्थ हैं, और उन कार्यों के लिए हमेशा उपयुक्त हैं, जिनकी हमें आवश्यकता है, और कुछ नौसिखिए डेवलपर्स उनके साथ मित्र हैं। इस लेख में, मैं शैलियों के साथ काम करने की मूल बातें के बारे में बात करना चाहूंगा और कुछ दिलचस्प उदाहरण दिखाऊंगा।



हमें अवलोनिया ढांचे में शैलियों की आवश्यकता क्यों है?

  1. तत्वों को अनुकूलित करते समय शैलियाँ अधिक स्वतंत्रता देती हैं;
  2. तत्वों के विवरण की नकल न करने दें;
  3. मार्कअप को स्वयं और उसके डिज़ाइन को अलग करें।

उदाहरण के एक जोड़े


शैलियों की बेहतर समझ के लिए, हम पहले एक उदाहरण की ओर मुड़ते हैं:

गोल बटन (एक ubuntu सूक्ति की तरह कुछ)
ऐसा करने के लिए, हम मानक टेम्पलेट (टेम्पलेट कैसे बनायें ) पैनल स्टैक और बटन के एक जोड़े से एक सरल मार्कअप बनाएंगे

<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 की ओर मुड़ें: पॉइंटरओवर छद्म वर्ग और दूसरी शैली जोड़ें:

  <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> 

लेकिन कभी-कभी यह पर्याप्त नहीं होता है, और मैं अपनी सभी परियोजनाओं में उपयोग के लिए शैलियों को एक अलग dll में रखना चाहता हूं।

ऐसा करने के लिए, ClassLibrary बनाएं और संसाधन एवलॉनिया के रूप में हमारी भविष्य की फ़ाइलों के लिए सहायता प्रदान करें:

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

अब परिचित Styles.xml और प्रोजेक्ट में 2 और नई फाइलें जोड़ें:



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> 

और सीएस फ़ाइल में हम परिभाषित करते हैं कि यह एक शैली है और अधिक नहीं:

 namespace ClassLibrary1 { public class DarkCustom:Styles { } } 

हमारी लाइब्रेरी में एक निर्भरता जोड़ें और स्टाइल को फिर से निर्दिष्ट करें, शैली को स्टाइल इनक्लूड और एवलोनिया संसाधन के रूप में निर्दिष्ट करें।

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

कुछ और उपयोगी


आधिकारिक Avalonia शैली ट्यूटोरियल ( tyk ) की जांच करना सुनिश्चित करें
आप इस या उस तत्व के लिए एक शैली लिखने के बारे में बुनियादी विचार प्राप्त कर सकते हैं ( tyk )
और यदि आपके पास अपनी शैली बनाने का समय / इच्छा नहीं है, तो आप इस अद्भुत शैली जनरेटर ( tyk ) का उपयोग कर सकते हैं



मैं ForNeVer kekekeks worldbeater को धन्यवाद कहना चाहूंगा

और ध्यान दें कि c # के लिए समर्थन यहाँ पाया जा सकता है , और यहाँ Avalonia के लिए।

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


All Articles