Tôi có vấn đề lạ với WPF, tôi đã tải hình ảnh từ đĩa lúc chạy và thêm chúng vào vùng chứa StackView. Tuy nhiên, hình ảnh không được hiển thị. Sau một vài lần gỡ lỗi, tôi đã tìm được thủ thuật, nhưng nó thực sự không có ý nghĩa gì cả. Tôi đã thực hiện một ứng dụng demo nhỏ để xác định các vấn đề:Tải ảnh động trong WPF
Tạo một dự án WPF mới, và dán mã như sau:
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, dán dưới usings mặc định :
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);
}
}
}
Sao chép một hình ảnh vào thư mục bin/Debug và gọi nó là 'picture.jpg'
Chương trình này không hiển thị bất cứ điều gì, trừ khi dòng chú thích không được chú ý.
Bất cứ ai có thể giải thích những gì tôi đang làm sai hay tại sao điều này xảy ra? Nếu bạn loại bỏ hình ảnh và chạy chương trình nó tạo ra một ngoại lệ trên dòng 'int q = ...'. Nếu dòng đó được nhận xét thì chương trình sẽ chạy mà không có ngoại lệ ngay cả khi không có hình ảnh nào. Chỉ tải hình ảnh nếu nessesary có ý nghĩa, nhưng sau đó hình ảnh sẽ được tải khi tôi thêm điều khiển Hình ảnh vào StackPanel.
Mọi id?
Chỉnh sửa: Nhân tiện, nếu bạn thêm hình ảnh làm tài nguyên, thì dòng 'int q = ..' là không cần thiết.
Tôi đã thử nghiệm điều này và nó hoạt động. Điều này tuy nhiên chứng minh rằng có một lỗi trong khuôn khổ, bởi vì nếu bạn thiết lập CacheOption để OnDemand hình ảnh không bao giờ được tải ngay cả khi nó phải được nạp trước khi beeing hiển thị trên màn hình. Cảm ơn cho tip, tôi đã không nhận thấy rằng tài sản. +1;) –
Giúp tôi quá :) –
... và tôi cũng vậy :) –