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?

Était-ce utile?

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();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top