WPF - en utilisant CroppedBitmap dans DataTemplate
-
19-09-2019 - |
Question
Le XAML suivant fonctionne bien dans 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>
Mais quand j'utilise le code équivalent dans un DataTemplate
je reçois l'erreur suivante dans l'exécution:
l'initialisation de l'objet a échoué (ISupportInitialize.EndInit). 'Source' Propriété non définie. Erreur à l'objet 'System.Windows.Media.Imaging.CroppedBitmap' dans le fichier de balisage.
intérieur Exception: { "propriété 'Source' est pas définie."}
La seule différence est que j'ai propriété Source du CroppedBitmap
lié de données:
<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>
Ce qui donne?
Mise à jour: Selon un ancien poste par Bea Stollnitz ceci est une limitation de la propriété source du CroppedBitmap
, parce qu'il met en œuvre ISupportInitialize
. (Cette information est en bas de page - faire une recherche sur « 11:29 » et vous verrez)
.
Est-ce encore un problème avec .Net 3.5 SP1?
La solution
Lorsque l'analyseur XAML crée CroppedBitmap, il fait l'équivalent de:
var c = new CroppedBitmap();
c.BeginInit();
c.Source = ... OR c.SetBinding(...
c.SourceRect = ...
c.EndInit();
EndInit()
exige Source
être non nulle.
Quand vous dites c.Source=...
, la valeur est toujours définie avant la EndInit (), mais si vous utilisez c.SetBinding(...)
, il essaie de faire la liaison immédiatement, mais détecte que DataContext
n'a pas encore été fixée. Par conséquent, il reporte la liaison à plus tard. Ainsi, lorsque EndInit()
est appelé, Source
est toujours nulle.
Ceci explique pourquoi vous avez besoin d'un convertisseur dans ce scénario.
Autres conseils
Je pensais que je compléterais autre réponse en fournissant le fait allusion à convertisseur.
Maintenant, j'utilise ce convertisseur et qui semble fonctionner, plus la propriété « Source n'est pas définie erreur.
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();
}
}