كيف يمكنني الحصول على صورة نقطية من أحد الموارد؟
-
21-08-2019 - |
سؤال
يتضمن التجميع الخاص بي صورة تحتوي على BuildAction==Resource.أريد الحصول على صورة نقطية من هذا المورد المضمن.
يمكنني تحميل صورة نقطية من ملف مثل هذا:
var bitmap = new BitmapImage(new Uri(path));
ولكن كيف يمكنني إنشاء Uri الذي يشير إلى صورة المورد المضمنة؟
عندما أحاول إنشاء "حزمة URI' (على سبيل المثال pack://application:,,,/MyImage.png
أو pack://application:,,,/MyAssembly;component/MyImage.png
)، تم طرح استثناء:
System.Urifformatexception "URI غير صالح:كان من المتوقع وجود منفذ نظرًا لوجود نقطتين (':') ولكن تعذر تحليل المنفذ."
لقد وجدت الإصلاح لـ UriFormatException في هذا مشاركة مدونة
ومع ذلك، مع تطبيق هذا الإصلاح، ما زلت أحصل على استثناءات عند محاولة تحميل صورة نقطية من حزمة URI.
عند استخدام pack://application:,,,/Image.png
التنسيق، أحصل على NullReferenceException، وعند استخدام pack://application:,,,/AssemblyName;component/Image.png
التنسيق، أحصل على NotSupportedException "لم يتم التعرف على بادئة Uri".
ملخصكانت مشكلتي أنني كنت أحاول استخدام "حزمة URI" في عملية قبل إنشاء مثيل لأي عنصر تحكم/نافذة/وما إلى ذلك في WPF، لذلك لم يتم تسجيل نظام URI "الحزمة" بعد (يجب أيضًا عدم تسجيل "أشياء" أخرى تتطلبها WPF يمكن ضبطه أيضًا، لأن تسجيل نظام الحزمة يدويًا لا يؤدي في حد ذاته إلى حل المشكلة).كان الحل هو الانتظار حتى بعد إنشاء عنصر تحكم مستخدم WPF الخاص بي لاستخدام عناوين URL للحزمة.
المحلول
صفحة MSDN هذه يحتوي على جميع المعلومات التي قد ترغب في معرفتها حول معرفات الموارد المنتظمة (URIs) للمورد في WPF (غالبًا ما تسمى معرفات URI الخاصة بالحزمة).سوف ترغب في استخدامها عناوين URL النسبية في كثير من الأحيان على الأرجح، لذلك انظر الجدول 4, ، والتي ينبغي أن تكون ذات فائدة خاصة.
إذا كنت تريد نظرة عامة أكثر إيجازًا على عناوين URL للمورد (الحزمة)، فراجع هذا بلوق وظيفة.يوضح أن بناء الجملة بسيط نسبيًا:
pack://application:,,,/ResourceFile.xaml
pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
ومع ذلك، هناك بعض المراوغات التي يجب حلها (في تجربتي)، لذا غالبًا ما يتطلب العثور على عنوان URI الصحيح للمورد القليل من التجارب.