نظرة عامة حول الموارد

تشرح هذه النظرة العامة كيفية استخدام موارد WPF كطريقة بسيطة لإعادة استخدام بشكل شائع الكائنات و القيم المعرفة . تركز هذه النظرة العامة حول استخدام الموارد في XAML. يمكنك أيضاً إنشاء ثم الوصول إلى الموارد باستخدام تعليمات برمجية أو بالتبادل بين التعليمات البرمجية "و" Extensible Application Markup Language (XAML). لمزيد من المعلومات، راجع الموارد و التعليمات البرمجية.

يشتمل هذا الموضوع على الأقسام التالية.

  • استخدام الموارد في XAML
  • الموارد الثابتة والحيوية
  • أنماط ، قوالب البيانات ، و مفاتيح ضمنية
  • موضوعات ذات صلة

استخدام الموارد في XAML

يحدد المثال التالي SolidColorBrush كمورد على عنصر الجذر من الصفحة. المثال يشير بعدها إلى المورد ثم يستخدمه لتعيين خصائص عدة عناصر تابعة بما في ذلك Ellipse ، TextBlock ، و Button.

<Page Name="root"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
>
  <Page.Resources>
    <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
    <Style TargetType="Border" x:Key="PageBackground">
      <Setter Property="Background" Value="Blue"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="TitleText">
      <Setter Property="Background" Value="Blue"/>
      <Setter Property="DockPanel.Dock" Value="Top"/>
      <Setter Property="FontSize" Value="18"/>
      <Setter Property="Foreground" Value="#4E87D4"/>
      <Setter Property="FontFamily" Value="Trebuchet MS"/>
      <Setter Property="Margin" Value="0,40,10,10"/>
    </Style>
    <Style TargetType="TextBlock" x:Key="Label">
      <Setter Property="DockPanel.Dock" Value="Right"/>
      <Setter Property="FontSize" Value="8"/>
      <Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
      <Setter Property="FontFamily" Value="Arial"/>
      <Setter Property="FontWeight" Value="Bold"/>
      <Setter Property="Margin" Value="0,3,10,0"/>
    </Style>
  </Page.Resources>
  <StackPanel>
    <Border Style="{StaticResource PageBackground}">
      <DockPanel>
        <TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
        <TextBlock Style="{StaticResource Label}">Label</TextBlock>
        <TextBlock DockPanel.Dock="Top" HorizontalAlignment="Left" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
        <Button DockPanel.Dock="Top" HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
        <Ellipse DockPanel.Dock="Top" HorizontalAlignment="Left" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="40" />
      </DockPanel>
    </Border>
  </StackPanel>
</Page>


كل عنصر من مستوى إطار عمل ( FrameworkElement أو FrameworkContentElement) يحتوي على خاصية Resources و التي هي الخاصية التي تحتوي على الموارد (مثل ResourceDictionary) التي يحددها المورد. يمكنك تعريف الموارد على أي عنصر. ومع ذلك، فإن الموارد غالباً معرّفة على عنصر الجذر و الذي هو Page في المثال.

يجب أن يحتوي كل مورد في قاموس المورد مفتاح فريد . عندما تقوم بتعريف الموارد في العلامات ، تقوم بتعيين المفتاح الفريد خلال س: مفتاح سمة. نموذجياً، المفتاح سلسلة; ومع ذلك، يمكنك أيضاً تعيينه إلى أنواع الكائنات الأخرى باستخدام ملحقات العلامات المناسبة. يتم استخدام المفاتيح nonstring للموارد حسب مناطق ميزة معينة في WPF و الملاحظ للأنماط ، موارد المكون و تنميط البيانات.

بعد تعريف مورد ، يمكنك الرجوع إلى المورد ليتم استخدامه لقيمة خاصية عن طريق استخدام بناء جملة ملحق علامات المورد الذي يحدد اسم المفتاح على سبيل المثال:

<Button Background="{StaticResource MyBrush}"/>
<Ellipse Fill="{StaticResource MyBrush}"/>

في المثال السابق، عند معالجة محمل XAMLلقيمة {StaticResource MyBrush} للخاصية Background على Button ،فإن منطق بحث الموارد أولاً يقوم بفحص قاموس المورد الخاص بعنصر Button . إذا كان Button لا يحتوي على تعريف مفتاح المورد ، MyBrush (لم يتم; مجموعة المورد الخاصة به فارغة) ، البحث بعدها يقوم بفحص عنصر الأصل من Button ، و الذي هو Page. وبالتالي، عندما تقوم بتعريف مورد في عنصر جذر Page ، كافة العناصر في شجرة وحدة التحكم المنطقي من Page يمكنهم الوصول إليه ، كما يمكنك إعادة استخدام نفس المورد لتعيين قيمة لأي خاصية تقبل Type الذي يمثله المورد. في المثال السابق ، نفس مورد MyBrush يقوم بتعيين اثنين من الخصائص المختلفة: Background من Button ، و Fill من Rectangle.

الموارد الثابتة والحيوية

المورد يمكن الاشارة إليه إما كمورد ثابت أو حيوي . ويتم هذا باستخدام إما ملحق علامات StaticResource أو ملحق علامات DynamicResource. ملحق العلامات هو ميزة لــ XAML حيث يمكنك تعيين مرجع كائن بواسطة جعل ملحق العلامات يقوم بمعالجة سلسلة السمة وإرجاع الكائن إلى محمل XAML . للحصول على مزيد من المعلومات حول سلوك ملحقات العلامات ، راجع ملحقات ترميز و XAML WPF.

عند استخدام ملحق العلامات ، توفر عادةً معلمة واحدة أو أكثر في نموذج السلسلة التي يتم معالجتها بواسطة هذا الملحق للعلامات المعين بدلاً من تقييمه في السياق للخاصية التي تم تعيينها. ملحق علامات StaticResource يقوم بمعالجة مفتاح بواسطة البحث قيمة للمفتاح في قواميس الموارد المتوفرة. يحدث هذا أثناء التحميل و الذي هو النقطة في الوقت عندما تحتاج عملية التحميل لتعيين قيمة الخاصية التي تأخذ مرجع المورد الثابت. ملحق علامات DynamicResource بدلاً من ذلك تقوم بمعالجة المفتاح عن طريق إنشاء تعبير و هذا التعبير يظل غير مقيم حتى يتم تشغيل التطبيق بالفعل, في أي وقت يتم تقييم التعبير كما يوفر قيمة.

عند الرجوع إلى المورد ، يمكن أن تؤثر الاعتبارات التالية في استخدام مرجع مورد ثابت أو حيوي :

  • التصميم العام لكيفية إنشاء الموارد الخاصة بالتطبيق الخاص بك (لكل صفحة, في التطبيق ، في XAML غير المحكم, في تجميع الموارد فقط).

  • الأداء الوظيفي للتطبيق: هل تحديث الموارد في الوقت الحقيقي جزءًا من متطلبات التطبيق الخاص بك ؟

  • سلوك البحث الخاص لذلك النوع للمرجع الخاص بالمورد.

  • نوع المورد أو الخاصية المعين وكذلك السلوك الأصلي لهذه الأنواع.

موارد ثابتة

مراجع المورد الثابت يقوم تعمل بشكل أفضل مع الحالات التالية:

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

  • تقوم بتعيين القيمة للخاصية الغير موجودة على DependencyObject أو Freezable.

  • تقوم بإنشاء صواب قاموس المورد الذي سيتم تحويله برمجياً إلى DLL ، و حزمه كجزء من التطبيق أو مشاركته بين التطبيقات.

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

  • تقوم باستخدام موارد لتعيين أعداد كبيرة من خصائص التبعية. خصائص التبعية لها تخزين مؤقت للقيمة نافذ المفعول كتمكينه بواسطة نظام الخاصية ذلك إذا قمت بتوفير قيمة لخاصية التبعية يمكن تقييمها في وقت التحميل ، خاصية التبعية لم يكن عليها التحقق من وجود تعبير غير مقيم وإرجاع آخر قيمة نافذة المفعول. يمكن أن تكون هذه التقنية فائدة للأداء.

  • تريد تغيير الموارد الأساسية الخاصة بالعملاء كلهم أو تريد الصيانة لمثيلات الكتابة المنفصلة لكل عميل باستخدام س: سمة مشتركة.

سلوك بحث الموارد الثابتة

  1. عملية البحث تقوم بالتحقق من المفتاح المطلوب ضمن قاموس المورد المعرّفة من قِبل العنصر الذي يقوم بتعيين الخاصية.

  2. عملية البحث بعدها تجتاز الشجرة المنطقية إلى أعلى ، إلى العنصر الأصل و قاموس المورد الخاص به. يستمر هذا حتى الوصول إلى عنصر الجذر .

  3. بعدها ، يتم التحقق من موارد التطبيق . موارد التطبيق هي تلك الموارد ضمن قاموس المورد الذي تم تعريفه بواسطة كائن Application لتطبيق WPF الخاص بك.

يقوم المورد الثابت بالإشارة من حيث يجب على قاموس المورد أن يشير إلى المورد الذي تم تعريفه بالفعل lexically قبل مرجع المورد. المراجع المتقدمة لا يمكن حلها بواسطة مرجع مورد ثابتة. لهذا السبب، إذا كنت تستخدم مراجع مورد ثابت ، يجب عليك تصميم بنية قاموس المورد الخاص بك بحيث يتم تعريف الموارد المخصصة للاستخدام بواسطة المورد عند أو بالقرب من من بداية كل قاموس مورد معني.

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

سلوك الاستثناء إذا لم يتم العثور على مرجع المورد الثابت يختلف. إذا كان المورد قد تم تأجيله ، سيحدث الاستثناء في وقت التشغيل. إذا كان المورد لم يكن قد تم تأجيله ، يحدث الاستثناء في وقت التحميل.

موارد حيوية

تعمل الموارد الحيوية بشكل أفضل مع الحالات التالية:

  • قيمة المورد تعتمد على الشروط التي لا تكون معروفة حتى وقت التشغيل. يتضمن هذا موارد النظام أو الموارد التي تكون قابلة للتعيين بواسطة المستخدم . على سبيل المثال، يمكنك إنشاء معين قيم يشير إلى خصائص النظام كما تم كشفها بواسطة SystemColors ، SystemFonts, أو SystemParameters. تكون هذه القيم حيوية بشكل صحيح لأنها تأتي من بيئة وقت التشغيل الخاص بالمستخدم و نظام التشغيل . قد يكون لديك نسق من مستوى التطبيق الذي يمكن تغييره حيث الوصول إلى المورد على مستوى الصفحة أيضاً يجب عليه أن يقوم بالتقاط التغيير.

  • تقوم بإنشاء أو الرجوع إلى أنماط النسق لعنصر تحكم المخصص.

  • كنت تريد ضبط محتويات ResourceDictionary أثناء وقت عمل التطبيق.

  • لديك بنية مورد معقدة تحتوي على اعتمادات داخلية ، حيث قد يكون المرجع الأمامي مطلوباً. لا تدعم مراجع المورد الثابتة المراجع الأمامية ولكن مراجع المورد الحيوية تدعمها لأن المورد لا يحتاج إلى أن يتم تقييمه حتى وقت التشغيل، و المراجع الأمامية ليس لها صلة بالمفهوم.

  • تقوم بالإشارة إلى المورد الكبير من منظور الترجمة أو مجموعة العمل و قد لا يتم استخدام المورد مباشرة عند تحميل الصفحة . مراجع المورد الثابت تقوم بالتحميل دوماً من XAML عند تحميل الصفحة; ومع ذلك، مرجع المورد الحيوي لا يقوم بالتحميل حتى يتم استخدامه فعليًا.

  • تقوم بإنشاء نمط حيث معين القيم قد يأتي من القيم الأخرى التي تأثرت من النسق أو إعدادات أخرى للمستخدم.

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

سلوك بحث المورد الحيوي

سلوك بحث المورد لمرجع المورد الحيوي يوازي سلوك البحث في التعليمات البرمجية الخاصة بك إذا قمت باستدعاء FindResource أو SetResourceReference.

  1. عملية البحث تقوم بالتحقق من المفتاح المطلوب ضمن قاموس المورد المعرّفة من قِبل العنصر الذي يقوم بتعيين الخاصية.

  2. عملية البحث بعدها تجتاز الشجرة المنطقية إلى أعلى ، إلى العنصر الأصل و قاموس المورد الخاص به. يستمر هذا حتى الوصول إلى عنصر الجذر .

  3. بعدها ، يتم التحقق من موارد التطبيق . موارد التطبيق هي تلك الموارد ضمن قاموس المورد الذي تم تعريفه بواسطة كائن Application لتطبيق WPF الخاص بك.

  4. يتم التحقق من قاموس مورد النسق ، للنسق النشط حالياً . إذا تغير النسق في وقت التشغيل ، يتم اعادة تقييم القيمة.

  5. يتم التحقق من موارد النظام.

يختلف سلوك الاستثناء (إن وجد):

  • إذا كان المورد قد تم طلبه من قِبل استدعاء FindResource و لم يتم العثور عليه ، فسيتم رفع استثناء.

  • إذا كان المورد قد تم طلبه بواسطة استدعاء TryFindResource و لم يتم العثور عليه ، فسيتم رفع استثناء لم ولكن القيمة التي تم إرجاعها تكون null. إذا كانت الخاصية التي تم تعيينها لا تقبل null ، إذاً فلا يزال من المحتمل حدوث استثناء أعمق (يعتمد هذا على الخاصية الفردية التي تم تعيينها).

  • إذا تم طلب مورد بواسطة مرجع مورد حيوي في XAML ، و لم يتم العثور عليه "، ثم يعتمد السلوك على نظام الخصائص العام ولكن السلوك العام كما إذا لم تحدث عملية إعداد خاصية على المستوى حيث يوجد المورد . على سبيل المثال، إذا حاولت تعيين خلفية عنصر زر فردي باستخدام مورد لم يتم تقييمه ، إذاً لن تقوم قيمة بتعيين نتائج ولكن مازال يمكن أن تأتي القيمة الفعالة من المشاركين الآخرين في أسبقية القيمة "و" نظام الخاصية. على سبيل المثال، القيمة الخلفية قد لا تزال تأتي من نمط أزرار معرف محلياً أو من نمط النسق. للخصائص غير المعرّفة بواسطة أنماط النسق ، قد تأتي القيمة النافذة المفعول بعد تقييم مورد فاشل من القيمة الافتراضية في بيانات تعريف الخاصية.

Restrictions (تقييدات)

مراجع المورد الحيوي تحتوي على بعض القيود الملحوظة . يجب ان يتحقق على الأقل واحد من الإجراءات التالية :

لأن الخاصية التي يتم تعيينها يجب أن تكون خاصية DependencyProperty أو Freezable صواب ، معظم تغييرات الخاصية يمكنهم النشر على UI لأن تغيير الخاصية (قيمة المورد الحيوية الذي تم تغييرها) يتم التعرف عليه بواسطة نظام الخاصية. تتضمن معظم عناصر التحكم المنطق الذي يقوم بفرض تخطيط آخر لعنصر تحكم إذا تغيرت DependencyProperty و تلك الخاصية قد تؤثر على التخطيط. ومع ذلك، كافة الخصائص التي تحتوي على ملحق علامات DynamicResource كالقيمة الخاصة بهم يتم ضمانهم لتوفير قيمة بطريقة يقومون فيها بالتحديث في الوقت الحقيقي في UI. أن الوظيفة لا تزال تختلف استناداً إلى الخاصية ، أيضاً على حسب النوع الذي يملك الخاصية, أو حتى البنية المنطقية للتطبيق الخاص بك.

أنماط ، قوالب البيانات ، و مفاتيح ضمنية

الإصدارات السابقة له، تم تحديد أن كافة العناصر في ResourceDictionary يجب أن تحتوي على مفتاح. ومع ذلك، هذا لا يعني إن كافة الموارد يجب أن يكونوا x:Key صريح. تدعم العديد من أنواع الكائنات مفتاح ضمني عند تعريفه كمورد عندما تكون قيمة المفتاح مرتبطة بقيمة خاصية أخرى . ويتم تعريف هذا كمفتاح ضمني ، حيث سمة x:Key مفتاح صريح. يمكنك الكتابة فوق أي مفتاح ضمني بواسطة تحديد مفتاح صريح.

سيناريو هام جداً للموارد هو عندما تقوم بتعريف Style. في الحقيقة ، Style يتم تعريفه دائمًا كإدخال في قاموس المورد لأن الأنماط بالأصل مخصصة لإعادة الاستخدام. لمزيد من المعلومات حول هذه الأنماط, انظر التنسيق و القولبة.

أنماط لعناصر التحكم يمكن انشاء كليهما و الاشارة إليهما بواسطة مفتاح ضمني. أنماط النسق التي تقوم بتحديد المظهر الافتراضي لعنصر التحكم تعتمد على هذا المفتاح الضمني. المفتاح الضمني من النقطة المستقلة الخاصة بطلبه هو Type الخاص بعنصر التحكم نفسه . المفتاح الضمني من النقطة المستقلة لتعريف المورد هو TargetType الخاص بالنمط. لذلك، إذا كنت تقوم بإنشاء نسق لعناصر التحكم المخصصة ، إنشاء الأنماط التي تقوم بالتفاعل مع أنماط النسق الموجودة ، لن تحتاج لتحديد س: مفتاح سمة لذلك Style. وإذا أردت استخدام الأنماط المنسقة, لن تحتاج لتحديد أي نمط على الإطلاق. على سبيل المثال،النمط التالي يعمل بالرغم من عدم ظهور مورد Style ليحتوي على مفتاح:

<Style TargetType="Button">
  <Setter Property="Background">
    <Setter.Value>
      <LinearGradientBrush>
        <GradientStop Offset="0.0" Color="AliceBlue"/>
        <GradientStop Offset="1.0" Color="Salmon"/>           
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>  
  <Setter Property="FontSize" Value="18"/>
</Style>

أن نمط بالفعل لديه مفتاح : المفتاح الضمني typeof(Button). في العلامات ، يمكنك تحديد TargetType مباشرة كاسم نوع (أو يمكنك بشكل اختياري استخدام {x: النوع...} بإرجاع Type.

خلال آليات نمط النسق الافتراضي المستخدمة من قبل WPF, يتم تطبيق هذا النمط كنمط وقت التشغيل من Button على الصفحة، حتى لو Button نفسه لا يحاول تحديد خاصية Style الخاصة به أو مرجع مورد محدد للنمط. النمط الخاص بك المحدد في الصفحة يتم العثور عليه في إصدار سابق من تسلسل البحث أقدم من نمط قاموس النسق باستخدام المفتاح نفسه الذي يحتويه نمط قاموس النسق. يمكنك فقط تحديد <Button>Hello</Button> في أي مكان من الصفحة والنمط التي قمت بتعريفه بــ TargetType من Button قد ينطبق على هذا الزر. إذا كنت تريد ، لا يزال بإمكانك فتح النمط بشكل صريح بنفس قيمة النوع كــ TargetType ، للوضوح في العلامات الخاصة بك ولكن هذا اختياري.

المفاتيح الضمنية لا تقوم بالتطبيق على عنصر التحكم إذا OverridesDefaultStyle كانت true (لاحظ أيضاً أنه OverridesDefaultStyle قد يتم تعيينها كجزء من السلوك الأصلي لفئة عنصر التحكم بدلاً من المثيل لعنصر التحكم بشكل صريح). أيضاً، من أجل دعم المفاتيح الضمنية لسيناريوهات الفئة المشتقة ، يجب على عنصر التحكم تجاوز DefaultStyleKey (كافة عناصر التحكم الموجودة المتوفرة كجزء من WPF تقوم بذلك). لمزيد من المعلومات حول تصميم عناصر التحكم ، النسق والأنماط راجع إرشادات حول تصميم عناصر تحكم قابلة لأخذ نمط.

DataTemplate أيضاً لديه مفتاح ضمني . الضمني الأساسي على DataTemplateهو DataTypeالقيمة خاصية. DataTypeكما يمكن تحديد كـ اسم النوع بدلاً من استخدام صراحة{x: نوع...}. للمزيد من التفاصيل ، راجع نظرة عامة حول قولبة البيانات.

راجع أيضًا:

المهام

كيفية القيام بما يلي: تعريف مورد و الإشارة إليه

المرجع

س: نوع ملحق العلامات

ResourceDictionary

ملحق علامات StaticResource

ملحق علامات DynamicResource

المبادئ

أمثلية الأداء: موارد التطبيق

الموارد و التعليمات البرمجية

نظرة عامة حول إدارة التطبيق