سؤال

أحاول ربط قائمة الكائنات المخصصة إلى WPF صورة مثل هذه:

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath}" />
    </Image.Source>
</Image>

لكنه لا يعمل.هذا هو الخطأ أنا الحصول على:

"الملكية 'UriSource' أو الممتلكات 'StreamSource' يجب تعيين."

ما أنا في عداد المفقودين ؟

هل كانت مفيدة؟

المحلول

WPF لديه المدمج في المحولات لأنواع معينة.إذا كنت ربط الصورة Source الملكية string أو Uri قيمة تحت غطاء محرك السيارة WPF سوف تستخدم ImageSourceConverter لتحويل القيمة إلى ImageSource.

لذلك

<Image Source="{Binding ImageSource}"/>

أن العمل إذا كان ImageSource الملكية تمثيل سلسلة من صالح URI إلى صورة.

يمكنك بالطبع لفة الخاص بك ملزمة converter:

public class ImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri(value.ToString()));
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

واستخدامه مثل هذا:

<Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/>

نصائح أخرى

هذه المادة قبل أتول غوبتا يحتوي على نموذج التعليمات البرمجية التي تغطي عدة سيناريوهات:

  1. الموارد العادية صورة ملزمة المصدر الملكية في XAML
  2. ملزمة الموارد الصورة ، ولكن من التعليمات البرمجية خلف
  3. ملزمة الموارد صورة في التعليمات البرمجية خلف باستخدام التطبيق.GetResourceStream
  4. تحميل صورة من الملف عن طريق الذاكرة تيار (نفسه ينطبق عند تحميل بلوق صورة البيانات من قاعدة البيانات)
  5. تحميل صورة من مسار الملف ، ولكن باستخدام ملزمة مسار ملف الممتلكات
  6. ملزمة صورة البيانات إلى عنصر تحكم المستخدم الذي له داخليا صورة التحكم عن طريق الاعتماد على الممتلكات
  7. نفس النقطة 5 ، ولكن أيضا ضمان أن الملف لا يحصل مغلق على القرص الثابت

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

<Image Width="90" Height="90" 
       Source="{Binding Path=ImageSource}"
       Margin="0,0,0,5" />

وفئة العقار ببساطة هذا

public object ImageSource {
    get {
        BitmapImage image = new BitmapImage();

        try {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            image.UriSource = new Uri( FullPath, UriKind.Absolute );
            image.EndInit();
        }
        catch{
            return DependencyProperty.UnsetValue;
        }

        return image;
    }
}

أعتقد أنه قد يكون العمل أكثر قليلا من قيمة المحول, وإنما هو خيار آخر.

تحتاج إلى أن يكون تنفيذ IValueConverter واجهة يحول uri إلى صورة.الخاص بك تحويل تنفيذ IValueConverter سوف ننظر بشيء من هذا القبيل:

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(value as string);
image.EndInit();

return image;

ثم سوف تحتاج إلى استخدام محول في الملزمة:

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" />
    </Image.Source>
</Image>

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

يؤدي هذا الملف الجديد مقابض يتم إنشاؤها بشكل مستمر و سيتم منع أي محاولة حذف الملف لأنه لا يزال قيد الاستخدام.هذا يمكن التحقق منها باستخدام عملية اكسبلورر.

إذا كان ملف الصورة قد تحذف في بعض نقطة, تحويل مثل هذه يمكن استخدامها:باستخدام XAML إلى ربط النظام.الرسم.صورة في النظام.يقوم نظام ويندوز.التحكم في الصورة

العيب مع هذه الذاكرة تيار الأسلوب هو أن صورة(ق) على تحميلها و فك كل مرة و لا التخزين المؤقت يمكن أن تحدث:"لمنع الصور من فك أكثر من مرة ، تعيين الصورة.المصدر الملكية من Uri بدلا من استخدام الذاكرة تيارات" المصدر:"نصائح الأداء لتطبيقات متجر ويندوز باستخدام XAML"

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

يمكنك استخدام

ImageSourceConverter الدرجة

للحصول على ما تريد

    img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top