سؤال

XAML التالي يعمل موافق داخل Window:

<Border Width="45" Height="55" CornerRadius="10" >
    <Border.Background>
        <ImageBrush>
            <ImageBrush.ImageSource>
                <CroppedBitmap Source="profile.jpg" SourceRect="0 0 45 55"/>
            </ImageBrush.ImageSource>
        </ImageBrush>    
    </Border.Background>
</Border>

ولكن عندما أستخدم التعليمات البرمجية المكافئة في DataTemplate أحصل على الخطأ التالي في وقت التشغيل:

فشل تهيئة الكائن (isupportinitialize.endinit). 'مصدر' لم يتم تعيين الخاصية. خطأ في الكائن 'system.windows.media.imaging.croppedbitmap' في ملف الترميز.
الاستثناء الداخلي:
لم يتم تعيين خاصية "المصدر". "}

الفرق الوحيد هو أن لدي CroppedBitmapمصدر بيانات الملكية المصدر:

<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>

ما يعطي؟

تحديث: وفقا ل المشاركة القديمة بواسطة Bea Stollnitz هذا هو قيد الملكية المصدر لل CroppedBitmap, ، لأنها تنفذ ISupportInitialize. وبعد (هذه المعلومات أسفل الصفحة - قم بالبحث في "11:29" وسترى).
هل لا يزال هذا مشكلة مع .NET 3.5 SP1؟

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

المحلول

عندما يقوم محلل XAML بإنشاء CroppedBitMap، فإنه يعادل:

var c = new CroppedBitmap();
c.BeginInit();
c.Source = ...    OR   c.SetBinding(...
c.SourceRect = ...
c.EndInit();

EndInit() يستوجب Source أن تكون غير فارغة.

عندما تقول c.Source=..., ، يتم دائما تعيين القيمة قبل الإندينيت ()، ولكن إذا كنت تستخدم c.SetBinding(...), ، يحاول أن تفعل الربط فورا ولكن يكتشف ذلك DataContext لم يتم تعيين بعد. لذلك يحدد الربط حتى وقت لاحق. وهكذا متى EndInit() يسمى، Source لا يزال فارغ.

هذا ما يفسر لماذا تحتاج إلى محول في هذا السيناريو.

نصائح أخرى

اعتقدت أنني سوف أكمل الجواب الآخر من خلال توفير محول الإشارة.

الآن يمكنني استخدام هذا المحول وهذا يبدو أنه يعمل، لم يتم تعيين خاصية المزيد من المصدر خطأ.

public class CroppedBitmapConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        FormatConvertedBitmap fcb = new FormatConvertedBitmap();
        fcb.BeginInit();
        fcb.Source = new BitmapImage(new Uri((string)value));
        fcb.EndInit();
        return fcb;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top