WPF - usando CroppedBitmap en DataTemplate
-
19-09-2019 - |
Pregunta
El siguiente XAML funciona bien dentro de un 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>
Pero cuando se utiliza el código equivalente en una DataTemplate
me sale el siguiente error en tiempo de ejecución:
Error en la inicialización de objetos (ISupportInitialize.EndInit). 'Fuente' propiedad no está establecida. Error en el objeto 'System.Windows.Media.Imaging.CroppedBitmap' en el archivo de anotación. Excepción
interno: { "propiedad 'Fuente' no está establecido."}
La única diferencia es que no tengo propiedad Source enlazado a datos del CroppedBitmap
:
<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>
Lo que da?
ACTUALIZACIÓN: De acuerdo con un antiguo puesto Bea Stollnitz esta es una limitación de la propiedad de origen de la CroppedBitmap
, ya que implementa ISupportInitialize
. (Esta información es abajo de la página - hacer una búsqueda en "11:29" y verá)
.
¿Sigue siendo un problema con .Net 3.5 SP1?
Solución
Cuando el analizador XAML crea CroppedBitmap, lo hace el equivalente a:
var c = new CroppedBitmap();
c.BeginInit();
c.Source = ... OR c.SetBinding(...
c.SourceRect = ...
c.EndInit();
EndInit()
requiere Source
a ser no nulo.
Cuando dice c.Source=...
, el valor siempre se establece antes de que el EndInit (), pero si se utiliza c.SetBinding(...)
, se trata de hacer la unión de inmediato, pero detecta que DataContext
aún no se ha establecido. Por lo tanto, difiere la unión hasta más tarde. Así, cuando se llama EndInit()
, Source
sigue siendo nula.
Esto explica por qué es necesario un convertidor en este escenario.
Otros consejos
pensé que iba a completar la otra respuesta proporcionando el aludido-al convertidor.
Ahora uso este convertidor y que parece que funciona, el error de no más propiedad Source' no está establecido.
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();
}
}