WPF - utilizzando CroppedBitmap in DataTemplate
-
19-09-2019 - |
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?
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();
}
}