WPF - mit CroppedBitmap in Datatemplate
-
19-09-2019 - |
Frage
Das folgende XAML arbeitet in einem Window
ok:
<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>
Aber wenn ich den entsprechenden Code in einem DataTemplate
ich die folgenden Fehler in der Laufzeit erhalten:
Fehlgeschlagen Objektinitialisierung (ISupportInitialize.EndInit). 'Source' Eigenschaft nicht festgelegt. Fehler beim Objekt 'System.Windows.Media.Imaging.CroppedBitmap' in Markup-Datei.
Inner Ausnahme: { " 'Source' Eigenschaft nicht festgelegt."}
Der einzige Unterschied ist, dass ich die CroppedBitmap
die Source-Eigenschaft dagetenbundenen haben:
<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>
Was soll das?
UPDATE: Nach einer alten Post von Bea Stöllnitz dies ist eine Einschränkung der Quelleigenschaft der CroppedBitmap
, weil es ISupportInitialize
implementiert. (Diese Informationen sind auf der Seite - eine Suche auf „11.29“ und Sie werden sehen)
.
Ist das immer noch ein Problem mit .NET 3.5 SP1?
Lösung
Wenn der XAML-Parser CroppedBitmap schafft, tut sie das Äquivalent von:
var c = new CroppedBitmap();
c.BeginInit();
c.Source = ... OR c.SetBinding(...
c.SourceRect = ...
c.EndInit();
EndInit()
erfordert Source
nicht-null sein.
Wenn Sie c.Source=...
sagen, wird der Wert immer vor dem EndInit () gesetzt, aber wenn man c.SetBinding(...)
, versucht er, die Bindung sofort zu tun, erkennt aber, dass DataContext
noch nicht gesetzt worden. Deshalb ist es aufschiebt, bis später die Bindung. Wenn also EndInit()
genannt wird, Source
ist immer noch null.
Dies erklärt, warum Sie einen Konverter in diesem Szenario müssen.
Andere Tipps
Ich dachte, ich würde vervollständigen href="https://stackoverflow.com/a/1726339/3195477">, indem der erwähnte zu Converter.
Jetzt benutze ich diesen Konverter und das scheint zu funktionieren, nicht mehr Source‘Eigenschaft nicht festgelegt Fehler.
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();
}
}