موارد التطبيق WPF و المحتوى و الملفات البيانات

Microsoft Windowsتطبيقات تعتمد الملفات التي تحتوي تشغيل بيانات غير تنفيذي، مثل كـ غالباًExtensible Application Markup Language (XAML)والصور، الفيديو، والصوت. Windows Presentation Foundation (WPF)دعما خاصا لتكوين، يعرف، و استخدام هذه الأنواع من ملفات البيانات، والتي تسمى ملفات بيانات تطبيق. يدور هذا الدعم حول مجموعة معينة من أنواع ملفات البيانات الخاصة بالتطبيق بما في ذلك :

  • ملفات المورد: الملفات التي يتم تحويلها برمجياً إلى أي من الملف التنفيذي أو تجميع WPF الخاص بالمكتبة .

  • ملفات المحتوى : ملفات البيانات المستقلة التي تحتوي على اقتران صريح بتجميع WPF القابل للتنفيذ .

  • موقع ملفات الأصل: ملفات البيانات المستقلة التي لا تحتوي على اقتران بتجميع WPF القابل للتنفيذ .

اختلاف هام واحد يتم جعله بين هذه الأنواع الثلاثة من الملفات هو إن ملفات الموارد والملفات المحتوى يتم التعرف عليهم في وقت الإنشاء; التجميع على معرفة صريحة بهما. لموقع الملفات الأصلية ، على الرغم من ذلك، تجميع قد لا يحتوي على معرفة بهم كلهم أو معرفة ضمنية خلال حزمة مرجع معرف موارد منتظم (URI) ; الحالة الأخيرة, لا يوجد هناك أي ضمان إن الموقع المشار إليه من أصل الملف موجود بالفعل.

للإشارة إلى ملفات بيانات التطبيق ، Windows Presentation Foundation (WPF) يستخدم "حزمة" مخطط معرف موارد منتظم (URI) ، والذي يتم وصفه بالتفاصيل فيحزمة ال URIفى WPF ).

يصف هذا الموضوع كيفية تكوين و استخدام ملفات بيانات التطبيق .

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

  • ملفات الموارد
  • ملفات المحتوى
  • موقع ملفات الأصل.
  • إعادة الإنشاء بعد تغيير نوع الإنشاء
  • موضوعات ذات صلة

ملفات الموارد

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

يجب عليك استخدام ملفات الموارد عند:

  • لا تحتاج إلى تحديث محتوى الخاص بملف المورد بعد التحويل البرمجي له في تجميع.

  • تريد تبسيط تعقيد توزيع التطبيق عن طريق تقليل عدد تبعيات الملف.

  • ملف بيانات التطبيق يجب أن يكون قابل للترجمة (راجع نظرة عامة حول التعميم و التعريب).

ملاحظةملاحظة

قواميس المورد ( ملفات XAML مع ResourceDictionary كعنصر المستوى الأعلى الخاص بهم) ليست ملفات الموارد WPF ; بينما ملفات الموارد WPF يمكن أن يكونوا قواميس المورد ، قاموس المورد ليس من الضروري أن تكون ملف المورد (راجع ResourceDictionary).

علاوة على ذلك،فإن ملفات الموارد WPF ليست نفس النوع كالنوع المضمن أو المرتبط من الموارد التي يمكن تكوينها باستخدام دعم NET Framewor. الأساسي لتجميعات الموارد (راجع إدارة الموارد التطبيق).بينما تدعم ملفات الموارد WPF دعم المورد المضمن NET Framewor. الأساسي ، فإن القدرة على الوصول إلى ملفات موارد WPF باستخدام معرفات URI أسهل من استخدام مساحات الأسماء.

تكوين ملفات الموارد

في WPF ، ملف المورد هو الملف الذي يتم تضمينه في مشروع Microsoft build engine (MSBuild) كـعنصر Resource .

<Project "xmlns=https://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <ItemGroup>
    <Resource Include="ResourceFile.xaml" />
  </ItemGroup>
  ...
</Project>
ملاحظةملاحظة

في Microsoft Visual Studio ، تقوم بإنشاء ملف مورد بإضافة ملف إلى المشروع وإعداد Build Action الخاص به إلى Resource.

عندما يتم انشاء المشروع ، MSBuild يقوم بالترجمة البرمجية للمورد في التجميع.

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

إلى تحميل ملف مورد، يمكنك استدعاء GetResourceStreamطريقة Applicationفئة، وتمرير يحزم URIالذي يعرف الملف المورد الذي تريده. GetResourceStreamإرجاعStreamResourceInfoالكائن، الكشف عن ملف مورد كـStreamويوضح بها نوع المحتوى.

كمثال ، يُظهر التعليمات البرمجية التالية كيفية استخدام GetResourceStream لتحميل ملف المورد Page وتعيينه كالمحتوى لــ Frame ( pageFrame):

' Navigate to xaml page
Dim uri As New Uri("/PageResourceFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetResourceStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page
// Navigate to xaml page
Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;

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

المثال التالي يعرض كيفية تحميل Page مباشرة في Frame ( pageFrame) باستخدام التعليمات البرمجية.

Dim pageUri As New Uri("/PageResourceFile.xaml", UriKind.Relative)
Me.pageFrame.Source = pageUri
Uri pageUri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;

المثال التالي هو العلامات المكافئة للمثال السابق.

<Frame Name="pageFrame" Source="PageResourceFile.xaml" />

ملفات التعليمات البرمجية الخاصة بالتطبيق مثل ملفات الموارد

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

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="SOOPage.xaml" />

يمكنك القيام بذلك عند تضمين ملف XAML في مشروع Microsoft build engine (MSBuild) كـعنصر Page .

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <ItemGroup>
    <Page Include="MainWindow.xaml" />
  </ItemGroup>
  ...
</Project>
ملاحظةملاحظة

في Visual Studio ، تقوم بإضافة Window ، NavigationWindow ، Page ، FlowDocument, أو ResourceDictionary جديد إلى المشروع ، الــ Build Action لملف العلامات ستعطي القيم افتراضية إلى Page.

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

ملاحظةملاحظة

إذا تم تكوين ملف XAML كعنصر Resource ولم يكن لديه ملف التعليمات البرمجية الخلفية ، صف XAML يتم ترجمته إلى تجميع بدلاً من إصدار ثنائي من الصف XAML.

ملفات المحتوى

يتم توزيع ملف المحتوي كـملف مفقود جانب التجميع القابل للتنفيذ. على الرغم من أنها غير مترجمة إلى تجميع ، يتم تحويل التجميعات برمجيًا ببيانات التعريف التي تقوم بتأسيس اقتران بكل ملف محتوى.

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

تكوين ملفات المحتوى

لإضافة ملف محتوى إلى مشروع ، ملف بيانات تطبيق يجب تضمينه كـعنصر Content . علاوة على ذلك، لأن ملف المحتوى لا يتم ترجمته مباشرة في التجميع ، ستحتاج إلى تعيين عنصر بيانات التعريف MSBuild CopyToOutputDirectory لتحديد ما إذا كان ملف المحتوى سيتم نسخه إلى الموقع الذي يرتبط بالتجميع المبني . إذا كنت تريد أن يتم نسخ المورد إلى مجلد إخراج البناء في كل مرة يتم إنشاء المشروع ، قم بتعيين عنصر بيانات التعريف CopyToOutputDirectory بقيمة Always . وإلا، يمكنك التأكد فقط من إن الإصدار الأحدث من المورد يتم نسخه إلى مجلد اخراج البناء باستخدام قيمة PreserveNewest .

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

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <ItemGroup>
    <Content Include="ContentFile.xaml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  ...
</Project>
ملاحظةملاحظة

في Visual Studio ، تقوم بإنشاء ملف محتوى بإضافة ملف الملف إلى المشروع وإعداد Build Action الخاصة به إلى Content ، وتعيين Copy to Output Directory الخاص به إلى Copy always (تماماً كـ Always) و Copy if newer (تماماً كــ PreserveNewest).

عندما يتم انشاء المشروع ، سمة AssemblyAssociatedContentFileAttribute يتم ترجمته في بيانات التعريف للتجميع لكل ملف محتوى .

[assembly: AssemblyAssociatedContentFile("ContentFile.xaml")]

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

[assembly: AssemblyAssociatedContentFile("Resources/ContentFile.xaml")]

القيمة AssemblyAssociatedContentFileAttribute أيضاً هي قيمة المسار لملف المحتوى في مجلد اخراج البناء .

استخدام ملفات المحتوى

إلى تحميل ملف محتوى، يمكنك استدعاء GetContentStreamطريقة Applicationفئة، وتمرير يحزم URIالتي تعرف المطلوب ملف المحتوى. GetContentStreamإرجاعStreamResourceInfoكائن، والذي يستهدف المحتوى ملفStreamويوضح بها نوع المحتوى.

كمثال ، تُظهر التعليمات البرمجية التالية كيفية استخدام GetContentStream لتحميل ملف المحتوى Page وتعيينه كالمحتوى لــ Frame ( pageFrame):

' Navigate to xaml page
Dim uri As New Uri("/PageContentFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetContentStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page
// Navigate to xaml page
Uri uri = new Uri("/PageContentFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetContentStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;

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

المثال التالي يعرض كيفية تحميل Page مباشرة في Frame ( pageFrame) باستخدام التعليمات البرمجية.

Dim pageUri As New Uri("/PageContentFile.xaml", UriKind.Relative)
Me.pageFrame.Source = pageUri
Uri pageUri = new Uri("/PageContentFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;

المثال التالي هو العلامات المكافئة للمثال السابق.

<Frame Name="pageFrame" Source="PageContentFile.xaml" />

موقع ملفات الأصل.

ملفات الموارد لديها علاقة صريحة بالتجميعات التي يتم توزيعها معها ، كما هو محدد بواسطة AssemblyAssociatedContentFileAttribute. ولكن, توجد أوقات عندما تحتاج إلى إنشاء إما علاقة ضمنية أو علاقة غير موجودة بين تجميع "و" ملف بيانات التطبيق، بما في ذلك :

  • ملف غير موجود في وقت التحويل البرمجي.

  • لا تعرف أي الملفات سوف يتطلبه التجميع الخاص بك حتى وقت التشغيل.

  • تريد أن تتمكن من تحديث الملفات بدون اعادة ترجمة التجميع المقترنين به.

  • يستخدم التطبيق الخاص بك ملفات بيانات كبيرة مثل الصوت و الفيديو و ترغب فقط في أن يقوم المستخدمون بتحميلها إذا تم اختيارهم.

من الممكن تحميل هذه الأنواع من الملفات باستخدام مخططات URI التقليدية مثل file:/// و أنظمة http:// .

<Image Source="file:///C:/DataFile.bmp" />
<Image Source="http://www.datafilewebsite.com/DataFile.bmp" />

ومع ذلك، تتطلب أنظمة file:/// و http:// من التطبيق الخاص بك وجود الثقة كاملة. إذا كان التطبيق الخاص بك هو تطبيق مستعرض XAML (XBAP) الذي تم تشغيله من إنترنت أو إنترانت و يتطلب فقط مجموعة من الأذونات المسموحة للتطبيقات المشغلة من هذه المواقع ، يمكن تحميل الملفات غير المحكمة من موقع التطبيق فقط من الأصل (تشغيل الموقع ). تُعرف مثل هذه الملفات بملفات موقع الأصل .

موقع ملفات الأصل هو فقط الخيار الوحيد للتطبيقات ذات الثقة جزئية على الرغم من أنه غير مقيد للتطبيقات ذات الثقة الجزئية. لا تزال تحتاج التطبيقات ذات الثقة الكاملة لتحميل ملفات بيانات التطبيق التي لا تعرفها حول وقت البناء; بينما قد تستخدم التطبيقات ذات الثقة الكاملة file:/// ، فمن المحتمل تثبيت ملفات بيانات التطبيق في نفس مجلد أو مجلد فرعي أو تجميع التطبيق. في هذه الحالة، استخدام موقع الرجوع الأصلي أصبح أسهل من استخدام file:/// ، لأن استخدام file:/// يتطلب منك العمل خارج المسار الكامل الخاص بالملف.

ملاحظةملاحظة

لم يتم تخزين المؤقت لموقع ملفات الأصل مع تطبيق مستعرض XAML (XBAP) على جهاز عميل ، بينما يتم لملفات المحتوى.وبالتالي، يتم فقط تحميلها عند طلبها بشكل خاص.إذا كان تطبيق تطبيق مستعرض XAML (XBAP) يحتوي على ملفات الوسائط الكبيرة ، تكوينهم كـموقع ملفات الأصل يعني إن بدء تشغيل التطبيق الأول أسرع وأن الملفات يتم تحميلها فقط على الطلب.

تكوين موقع للملفات الأصلية

إذا كان موقع الملفات الأصلية الخاص بك غير معروف أو غير موجود في وقت التحويل البرمجي, قد تحتاج إلى استخدام آليات توزيع تقليدية لضمان إن الملفات المطلوبة متوفرة في وقت التشغيل بما في ذلك استخدام إما برنامج سطر التعليمات البرمجية XCopy أو Microsoft Windows Installer.

إذا كنت تعرف في وقت التحويل البرمجي الملفات التي تريد أن يتم تحديد موقعها في موقع الأصل ولكن لا يزال يريد تجنب تبعية صريحة ، يمكنك إضافة تلك الملفات إلى مشروع Microsoft build engine (MSBuild) كعنصر None . كما مع ملفات المحتوى ، قد تحتاج إلى تعيين سمة MSBuild CopyToOutputDirectoryلتحديد إن موقع الملف الأصلي يتم نسخه إلى موقع متناسب مع التجميع المبني بواسطة تحديد إما قيمة Always أو قيمة PreserveNewest .

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <None Include="PageSiteOfOriginFile.xaml">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
  ...
</Project>
ملاحظةملاحظة

في Visual Studio ، تقوم بإنشاء موقع الملف الأصلي بواسطة إضافة ملف إلى المشروع وإعداد Build Action الخاص به إلى None.

عندما يتم بناء المشروع ، MSBuild ينسخ الملفات المحددة إلى مجلد إخراج البناء.

استخدام موقع الملفات أصلي

لتحميل موقع الأصل ملف، يمكنك استدعاء GetRemoteStreamأسلوب Applicationفئة، وتمرير يحزم URIالتي تعرف الموقع الذي تريده من أصل ملف. GetRemoteStreamإرجاعStreamResourceInfoكائن، والذي يستهدف موقع أصل الملف كـStreamويوضح بها نوع المحتوى.

كمثال ، التعليمات البرمجية التالية توضح كيفية استخدام GetRemoteStream لتحميل موقع Page الخاص بالملف الأصلي وتعيينها كمحتويات لــ Frame ( pageFrame).

' Navigate to xaml page
Dim uri As New Uri("/SiteOfOriginFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetRemoteStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page
// Navigate to xaml page
Uri uri = new Uri("/SiteOfOriginFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetRemoteStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;

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

المثال التالي يعرض كيفية تحميل Page مباشرة في Frame ( pageFrame) باستخدام التعليمات البرمجية.

Dim pageUri As New Uri("pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml", UriKind.Absolute)
Me.pageFrame.Source = pageUri
Uri pageUri = new Uri("pack://siteoforigin:,,,/SiteOfOriginFile.xaml", UriKind.Absolute);
this.pageFrame.Source = pageUri;

المثال التالي هو العلامات المكافئة للمثال السابق.

<Frame Name="pageFrame" Source="pack://siteoforigin:,,,/SiteOfOriginFile.xaml" />

إعادة الإنشاء بعد تغيير نوع الإنشاء

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

راجع أيضًا:

المبادئ

حزمة ال URIفى WPF