הרחבות סימון של XAML
- 10 דקות
חלק גדול מהגדרת ה- XAML שלך יוסדר בזמן ההידור. לעתים קרובות אתה יודע היכן יש למקם רכיבים, באילו צבעים וגופנים ייעשה שימוש, באילו ערכים ליטרליים יש להקצות למאפיינים.
עם זאת, לעתים עליך להגדיר ערך מאפיין לערך שלא ניתן לקבוע בזמן ההידור. ערכים אלה ידועים רק כאשר התוכנית פועלת. במצבים אלה, באפשרותך ליצור אובייקט המספק ערך ל- XAML בזמן ריצה. XAML תומך הרחבות למטרה זו.
ביחידה זו, תלמד כיצד ליצור הרחבות סימון ולהשתמש בהן.
מהי סיומת סימון?
סיומת סימון היא מחלקה שבה אתה משתמש ב- XAML כדי לגשת לערכים של זמן ריצה. נניח שיש לך תוויות רבות המוגדרות בממשק המשתמש של XAML, וברצונך להגדיר את המאפיין FontSize לאותו ערך ביישום כדי להבטיח שכל סגנון התוויות יהיה עקבי. באפשרותך להגדיר את FontSize באמצעות XAML כפי שמוצג בדוגמה הבאה:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="28"
HorizontalOptions="CenterAndExpand"/>
באפשרותך לחזור על אותה הגדרה עבור כל תווית, אך מה אם תרצה לשנות ערך זה מאוחר יותר? עליך למצוא כל מופע של מאפיין זה ולבצע את השינוי. כמו כן, נניח שאינך יודע באיזה ערך להשתמש; ניתן לחשב אותו בזמן ריצה בהתבסס על גורמים כגון כיוון המכשיר, רזולוציית המסך או שיקולים אחרים. במקרים אלה, אתה צריך משהו מתוחכם יותר מאשר ליטרל בקוד קשיח. כאן הרחבת סימון שימושית. הרחבות סימון מספקות לך גמישות באופן שבו אתה משיג ערך המשמש ב- XAML.
יצירת סיומת סימון
הרחבת סימון היא מחלקה המיישמת את Microsoft.Maui.Controls.Xaml.IMarkupExtension הממשק. ממשק זה מגדיר שיטה אחת, ProvideValue, עם החתימה הבאה:
public object ProvideValue(IServiceProvider serviceProvider)
{
...
}
מטרת שיטה זו היא לספק ערך עבור סימון ה- XAML שלך. שים לב שסוג ההחזרה הוא object, כך שהערך יכול להיות מכל סוג כל עוד הוא מתאים למקום שבו נעשה בו שימוש. לדוגמה, בסיומת סימון המחשבת ומחזירה גודל גופן, סוג ההחזרה צריך להיות double.
הפרמטר serviceProvider מכיל מידע הקשרי אודות מיקום סיומת הסימון המשמש בקוד XAML; בין פיסות מידע אחרות, הוא מזהה את הפקד שעליו מוחלת ההרחבה.
באפשרותך לשמור על סיומת הסימון עבור FontSize המאפיין. בדוגמה הבאה, מחלקת MainPage חושפת שדה double בשם MyFontSize. מחלקת GlobalFontSizeExtension מיישמת את IMarkupExtension הממשק, ושיטה ProvideValue מחזירה את הערך של MyFontSize משתנה:
namespace MyMauiApp;
public partial class MainPage : ContentPage
{
public const double MyFontSize = 28;
public MainPage()
{
InitializeComponent();
...
}
...
}
public class GlobalFontSizeExtension : IMarkupExtension
{
public object ProvideValue(IServiceProvider serviceProvider)
{
return MainPage.MyFontSize;
}
}
הערה
השדה MyFontSize חייב להיות חבר static המחלקה MainPage כדי לאפשר הפניה לפעולת השירות ProvideValue זו. שיטות עבודה טובות מרמזות כי במקרה זה, המשתנה צריך להיות גם קבוע. ערך const הוא static.
פעולת ProvideValue הבאה עשויה גם לבצע התאמות בערך המוחזר, בהתאם הכיוון וגורמים צורה של המכשיר.
החלת הרחבת הסימון על פקד ב- XAML
כדי להשתמש בסיומת הסימון בקוד XAML, הוסף את מרחב השמות המכיל GlobalFontSizeExtension המחלקה לרשימת מרחבי השמות בתג ContentPage. בדוגמה הבאה, מרחב שמות זה כולל את הכינוי mycode:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:mycode="clr-namespace:MyMauiApp"
x:Class="MyMauiApp.MainPage">
באפשרותך להשתמש בסיומת הסימון כדי להגדיר את FontSize המאפיין החדש כך. שים לב שהמוסכמה היא שלסיומת סימון יש את הסיומת '' בשם שלה. XAML מזהה סיומת זו, ואינך צריך לכלול אותה כאשר אתה מתקשר להרחבה מקוד XAML. בדוגמה הבאה, ההפניה GlobalFontSizeExtension המחלקה מתבצעת בדיוק כמו GlobalFontSize:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{mycode:GlobalFontSize}"
HorizontalOptions="CenterAndExpand"/>
באפשרותך להחיל את אותה סיומת סימון לכל אורך קוד ה- XAML שלך עבור כל פקד שצריך לציין את גודל הגופן. מאוחר יותר, אם תחליט לשנות את גודל הגופן, יהיה עליך לשנות רק את MyFontSize של משתנה הגופן MainPage הגופן.
המחלקה StaticExtension
עד כמה שהרחבת GlobalFontSize, לא סביר שתיצור הרחבה כזו. הסיבה לכך היא פשוטה; .NET MAUI כבר מספק הרחבה מוכללת יותר המאפשרת לך להפנות לכל ערך סטטי בקוד שלך. הרחבה זו נקראת StaticExtension, או Static לקצר. הקוד הבא מציג את החלוקה לרמות הבסיסית של מחלקת הרחבה זו:
[ContentProperty ("Member")]
public class StaticExtension : IMarkupExtension
{
public string Member {get; set;}
public object ProvideValue (IServiceProvider serviceProvider)
{
...
}
}
הערה
המטרה של הרחבות סימון מותאמות אישית היא לאפשר לך לטפל במצבים מורכבים יותר ולא במצבים סטטיים פשוטים. לדוגמה, ייתכן שיהיה עליך לשנות באופן דינאמי את גודל הגופן בהתבסס על גורם צורה של מכשיר.
כדי להשתמש במחלקה זו בקוד XAML, ספק את שם המשתנה הסטטי שאליו ברצונך להפנות במאפיין Member, ושיטה ProvideValue מחזירה ערך במשתנה זה. הדוגמה הבאה ממחישה כיצד להשתמש בה:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{x:Static Member=mycode:MainPage.MyFontSize}"
HorizontalOptions="CenterAndExpand"/>
.NET MAUI מספק ערכה של מחלקות אחרות של הרחבות סימון, שבהן ניתן להשתמש עבור תרחישים כגון איגוד נתונים, הפניה למשאבים וסגנונות דינאמיים ולטיפול במערכים של נתונים.