J'ai un problème étrange avec WPF, je chargeais des images du disque à l'exécution et les ajoutais à un conteneur StackView. Cependant, les images n'étaient pas affichées. Après un peu de débogage, j'ai trouvé l'astuce, mais ça n'a vraiment aucun sens. Je l'ai fait une petite application de démonstration pour identifier le problème:Chargement dynamique des images dans WPF
Créer un nouveau projet WPF et coller le code comme suit:
XAML:
<Window x:Class="wpfBug.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
<StackPanel Name="sp">
</StackPanel>
</Window>
xaml.cs, coller ci-dessous usings par défaut :
namespace wpfBug
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Image i = new Image();
BitmapImage src = new BitmapImage();
src.BeginInit();
src.UriSource = new Uri("picture.jpg", UriKind.Relative);
src.EndInit();
i.Source = src;
i.Stretch = Stretch.Uniform;
//int q = src.PixelHeight; // Image loads here
sp.Children.Add(i);
}
}
}
Copier une image dans le dossier bin/Debug et l'appeler 'picture.jpg'
Ce programme n'affiche rien, à moins que la ligne commentée ne soit décommentée. Est-ce que quelqu'un peut expliquer ce que je fais mal, ou pourquoi cela se produit-il? Si vous supprimez l'image et lancez le programme, elle génère une exception sur la ligne 'int q = ...'. Si cette ligne est commentée, le programme s'exécute sans exceptions même si aucune image n'est présente. Chargement d'une image seulement si nessesary a du sens, mais alors l'image doit être chargée lorsque j'ajoute le contrôle Image au StackPanel.
Des idées? Editer: En passant, si vous ajoutez l'image en tant que ressource, la ligne 'int q = ..' n'est pas nécessaire.
J'ai testé ça et ça marche. Cela prouve cependant qu'il y a un bug dans le framework, car si vous définissez CacheOption sur OnDemand, l'image n'est jamais chargée même si elle doit être chargée avant d'être affichée à l'écran. Merci pour le pourboire, je n'ai pas remarqué cette propriété. +1;) –
M'a aidé aussi :) –
... et moi aussi :) –