ملحقات تمييز XAML

مكتمل

سيتم تسوية الكثير من تعريف 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 مجموعة من فئات ملحق العلامات الأخرى، والتي يمكنك استخدامها لسيناريوهات مثل ربط البيانات، والإشارة إلى الموارد والأنماط الديناميكية، ومعالجة صفائف البيانات.

اختبر معلوماتك

1.

ما ملحق العلامات الذي يسمح لك بتعيين خاصية XAML إلى قيمة ثابتة تم تعريفها في فئة التعليمات البرمجية في الخلف؟

2.

ما هي الواجهة التي تستخدمها لإنشاء ملحق علامات مخصص؟