Ich habe ein seltsames Problem mit WPF. Ich habe Bilder von der Festplatte zur Laufzeit geladen und sie zu einem StackView-Container hinzugefügt. Die Bilder wurden jedoch nicht angezeigt. Nach einigem Debugging habe ich den Trick gefunden, aber es macht wirklich keinen Sinn. Ich habe eine kleine Demo-Anwendung, das Problem zu identifizieren:Dynamisches Laden von Bildern in WPF
Erstellen Sie ein neues WPF-Projekt und Einfügen von Code wie folgt:
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, Paste unter Standard usings :
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);
}
}
}
kopieren ein Bild auf das bin/Debug-Ordner und nennen es 'picture.jpg'
Dieses Programm zeigt nichts an, außer die Kommentarzeile ist unkommentiert.
Kann mir jemand erklären, was ich falsch mache oder warum das passiert? Wenn Sie das Bild entfernen und das Programm ausführen, wird eine Ausnahme in der Zeile 'int q = ...' generiert. Wenn diese Zeile kommentiert ist, wird das Programm ohne Ausnahmen ausgeführt, auch wenn kein Bild vorhanden ist. Ein Bild nur laden, wenn es Sinn macht, aber dann sollte das Bild geladen werden, wenn ich das Image-Steuerelement zum StackPanel hinzufüge.
Irgendwelche ides?
Edit: Übrigens, wenn Sie das Bild als Ressource hinzufügen, wird die 'int q = ..' Zeile nicht benötigt.
Ich habe das getestet und es funktioniert. Dies beweist jedoch, dass es einen Fehler im Framework gibt, denn wenn Sie CacheOption auf OnDemand setzen, wird das Bild nie geladen, auch wenn es geladen werden sollte, bevor es auf dem Bildschirm angezeigt wird. Danke für den Tipp, ich habe dieses Eigentum nicht bemerkt. +1;) –
hat mir auch geholfen :) –
... und ich auch :) –