2011-04-18 37 views
6

Tôi đang cố gắng tải một số BitmapImages từ các tệp được lưu trữ trên hệ thống tệp. Tôi có một từ điển khóa và các tập tin tương đối. Thật không may các nhà xây dựng Uri dường như không xác định theo cách mà nó sẽ tải các hình ảnh.C# Uri tải không xác định?

Đây là mã của tôi:

foreach(KeyValuePair<string, string> imageLocation in _imageLocations) 
{ 
    try 
    { 
     BitmapImage img = new BitmapImage(); 
     img.BeginInit(); 
     img.UriSource = new Uri(@imageLocation.Value, UriKind.Relative); 

     img.EndInit(); 
     _images.Add(imageLocation.Key, img); 
    } 
    catch (Exception ex) 
    { 
     logger.Error("Error attempting to load image", ex); 

    } 
} 

Đáng tiếc là đôi khi các URI được nạp dưới dạng tập tin tương đối URI và đôi khi họ có được nạp như tương Gói URI. Có vẻ như không có bất kỳ vần điệu hoặc lý do nào mà sẽ được tải theo cách đó. Đôi khi tôi nhận được tất cả các Uris tải một cách, hoặc chỉ một vài, hoặc hầu hết trong số họ, và nó sẽ thay đổi mỗi khi tôi chạy mã.

Bất kỳ ý tưởng gì đang diễn ra ở đây?

+1

bạn có thể sao chép hành vi này trong một dự án thử nghiệm có sạch không? –

Trả lời

3

Vâng, loại ... MSDN có này để nói về UriKind:

URI Absolute được đặc trưng bởi một tài liệu tham khảo đầy đủ để tài nguyên (ví dụ: http://www.contoso.com/index.html), trong khi một Uri tương đối phụ thuộc vào một trước URI cơ sở đã xác định (ví dụ: /index.html)

Nếu bạn nhảy vào phản xạ và nhìn xung quanh, bạn có thể thấy có rất nhiều đường dẫn mã cần thực hiện để giải quyết URI tương đối. Nhưng dù sao, nó không phải là không xác định của nó, nó nhiều hơn rằng nó chỉ là một nguồn chính của sự thất vọng cho nhiều nhà phát triển. Một điều mà bạn có thể làm là cảm nhận lớp 'BaseUriHelper' để tìm hiểu mức độ uris của bạn đang được giải quyết.

Mặt khác, nếu bạn biết nơi tài nguyên của bạn đang được lưu trữ (và bạn nên) Tôi sẽ đề nghị bạn chỉ nên tự mình đau đầu và sử dụng một URI tuyệt đối để giải quyết tài nguyên của bạn. Hoạt động mọi lúc, và không có mã goofy đằng sau hậu trường để đi du lịch bạn khi bạn ít mong đợi nó.

+0

Các đường dẫn đến tài nguyên của tôi là tương đối chứ không phải là tuyệt đối. Tôi đã giải quyết được vấn đề cụ thể mà tôi đang gặp phải, nhưng giải pháp có vẻ khá là khờ dại. –

+0

vâng, cảm ơn vì đã lấy lời khuyên và tự đưa ra câu trả lời. Rất tuyệt. –

+0

Nếu nó khiến bạn không hài lòng, bạn có thể đánh dấu màu xanh lá cây :-p –

1

Cuối cùng, tôi giải quyết được vấn đề bằng cách lấy Thư mục cơ sở của ứng dụng và nối đường dẫn tương đối vào đó và sử dụng một URI tuyệt đối thay vì một URI tương đối.

string baseDir = AppDomain.CurrentDomain.BaseDirectory; 

foreach(KeyValuePair<string, string> imageLocation in _imageLocations) 
{ 
    try 
    { 
     BitmapImage img = new BitmapImage(); 
     img.BeginInit(); 
     img.UriSource = new Uri("file:///" + baseDir + @imageLocation.Value, UriKind.Absolute); 

     img.EndInit(); 
     _images.Add(imageLocation.Key, img); 
    } 
    catch (Exception ex) 
    { 
     logger.Error("Error attempting to load image", ex); 

    } 
} 
+0

Bạn nên thử Path.Combine (chuỗi, chuỗi). http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx – Francisco

Các vấn đề liên quan