Domanda

Il seguente codice xaml funziona bene all'interno di 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>

Ma quando uso il codice equivalente in un DataTemplate Ottengo il seguente errore in fase di esecuzione:

Non è riuscita l'inizializzazione dell'oggetto (ISupportInitialize.EndInit).'Fonte' proprietà non è impostata.Errore in oggetto 'Sistema.Windows.Media.Imaging.CroppedBitmap' nel file di markup.
Eccezione Interna:
{"'Fonte' proprietà non è impostata."}

L'unica differenza è che ho la CroppedBitmap's di proprietà dell'Origine dati-bound:

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

Che cosa dà?

AGGIORNAMENTO: Secondo un post by Bea Stollnitz questa è una limitazione della proprietà origine dell' CroppedBitmap, poiché implementa ISupportInitialize.(Questa informazione è la pagina verso il basso - fare una ricerca su "11:29" e vedrete).
Questo è ancora un problema .Net 3.5 SP1?

È stato utile?

Soluzione

Quando il parser XAML crea CroppedBitmap, non l'equivalente di:

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

EndInit() richiede Source non è null.

Quando si dice c.Source=..., il valore è sempre impostato prima il EndInit(), ma se si utilizza c.SetBinding(...), prova a fare il binding subito, ma rileva che DataContext non è ancora stato fissato.Pertanto si rinvia l'associazione fino a tardi.Così, quando EndInit() è chiamato, Source è ancora nullo.

Questo spiega perché è necessario un convertitore in questo scenario.

Altri suggerimenti

Ho pensato di completare l'altra risposta fornendo il allude a Converter.

Ora io uso questo convertitore e che sembra funzionare, non più Fonte di proprietà non è impostata di errore.

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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top