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?

¿Fue útil?

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();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top