2011-07-26 32 views
8

Tôi đang đặt nội dung của Nút thành Hình ảnh. Có vẻ như sau:Tại thời điểm thiết kế gói uri là hợp lệ, nhưng không phải lúc chạy?

<Button> 
    <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" /> 
</Button> 

Trong dự án của tôi, tôi có thư mục con có tên NavigationImages và trong thư mục đó là tệp hình ảnh nav_up_left.png.

Khi tôi xem Nhà thiết kế hình ảnh xuất hiện, tuy nhiên trong thời gian chạy, tôi nhận được lỗi IOException nói rằng nó không thể định vị tài nguyên.

Hành động xây dựng được đặt thành Tài nguyên.

Thực ra, điều này làm việc tốt trong một dự án. Nhưng khi tôi sao chép nó qua một dự án khác nó không thành công. Điều này có vẻ như là một vấn đề vô cùng đơn giản, nhưng tôi thấy mình bị bối rối và sẵn sàng để bắt đầu kéo tóc ra. @ _ @

Suy nghĩ và đề xuất của bạn sẽ được nhiều người đánh giá cao!

Trả lời

9

Whelp, tôi đã tìm ra ... kinda.

Tôi đã sao chép mã xaml đó từ một dự án trong đó loại đầu ra là Ứng dụng Windows, đến một dự án khác, nơi loại đầu ra là Thư viện lớp.

Tôi không nghĩ về nó vào thời điểm đó, nhưng dường như khi loại đầu ra là một Thư viện lớp mà URI gói cần phải thay đổi.

Vì vậy, thay vì "pack://application:,,,/NavigationImages/nav_up_left.png" tôi đã đổi số này thành "/ProjectName;component/NavigationImages/nav_up_left.png" và bây giờ nó hoạt động tốt.

Tôi không rõ 100% lý do tại sao tính năng này hoạt động chứ không phải nguyên bản. Tôi đã đọc qua MSDN documentation on pack URIs in WPF nhưng có lẽ tôi đã hiểu sai một cái gì đó.

Tôi sẽ bỏ chọn câu trả lời này trong trường hợp ai đó có thể cho tôi giải thích lý do tại sao những gì tôi đã làm trước đó không hoạt động trong một dự án có Thư viện lớp loại đầu ra.

Tôi có thể thiếu cái gì đó thực sự đơn giản. @ _ @

+0

nhầm lẫn ... bạn có thay đổi nó thành trạng thái bạn muốn hoặc là "gói: // application: ,,,/ProjectName; component/NavigationImages/nav_up_left.png"? – mike01010

+1

Xin chào. Đã một thời gian kể từ khi tôi gặp sự cố này, nhưng tôi chắc chắn rằng tôi đã thay đổi nó thành "/ProjectName;component/NavigationImages/nav_up_left.png" –

+0

Tôi vừa thử nghiệm điều này. Cả hai tùy chọn đều hoạt động (với gói: // application: ,,, và không có) – surfen

1

Một giải pháp khác để nhận được quyền này:

Khi bạn hình ảnh Build Action được thiết lập để 'Resource' và bạn đã xây dựng lại, điều hướng đến các thuộc tính của đối tượng <Image /> của bạn. Cửa sổ thuộc tính sẽ cung cấp một trình duyệt tập tin tài nguyên ..., và rồi chọn hình ảnh của bạn Source="..." thuộc tính của bạn <Image /> sẽ được lấp đầy một cách chính xác trong.

2

Chỉ cần để tỏa sáng một ánh sáng vào những gì đang xảy ra trong tình huống của bạn. Ui gói thứ hai. Người đã làm việc. Có nghĩa là cho các nguồn tài nguyên nằm trong một hội đồng khác với ứng dụng máy chủ. Bằng những âm thanh của nó, ứng dụng máy chủ đang tải tài nguyên này từ Thư viện lớp được đề cập?

Bạn có thể thấy sự khác biệt trong các đề án gói uri đây: MSDN Pack URI Scheme

Những thay đổi uri hơi khi tham khảo một nguồn tài nguyên từ lắp ráp chính, và tham khảo một từ lắp ráp khác.

Ngoài ra, gói: // application: ,,, bao gồm những gì được gọi là "cơ quan", để bỏ qua nó về cơ bản sẽ làm cho nó một đường dẫn tương đối, cả hai đều hợp lệ trong hầu hết các trường hợp .

EDIT: về cơ bản vì /Subfolder/Resource.xaml(.jpg v.v.) và /Assembly;component/Resource.xaml rất giống nhau, sau này cho trình phân tích cú pháp/trình tải rằng nó đang tìm kiếm trong một hội đồng được tham chiếu, chứ không phải trong ứng dụng chính của hội đồng. (Tôi tưởng tượng điều này giúp tăng tốc độ tìm kiếm).

+0

+1 đây có lẽ là giải thích gần nhất cho những gì đã xảy ra, hãy liên kết :-) – Heliac

3

Tôi chỉ vật lộn với vấn đề tương tự này trong một thời gian, và tôi nghĩ rằng một phần của những gì đã xảy ra sai trong bản gốc là từ "thành phần" còn thiếu. Tôi, ví dụ, có

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;images/mona2.jpg"); 

nhưng nên đã

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg"); 

Từ "thành phần" không phải là một phần của tên đường dẫn, bất chấp sự xuất hiện của nó - đó là một chuỗi chữ mà đã ở đó. Tại sao? Có người nghĩ đó là một ý kiến ​​hay, tôi đoán vậy.

Và đối với những người đang vật lộn với một phần khác của sự vật, về "MyApp" thì sao? Đó là tên của Hội đồng. Nhấp chuột phải vào tên dự án của bạn, chọn "Properties ..." và trong tab "Application" bạn sẽ thấy trường "Assembly name:".

Nếu bạn không cảm thấy như tìm kiếm đó (hoặc lo lắng rằng nó có thể thay đổi, phá vỡ mã của bạn), bạn có thể làm điều này:

String appUri = @"pack://application:,,,/" + 
        System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";"; 
String path = appUri + "component/images/mona2.jpg"; 
myBitmapImage.UriSource = new Uri(path); 

Không mã rất đẹp, tôi thừa nhận - nó có thể rõ ràng là được rút ngắn - nhưng nó sẽ đưa bạn đến nơi bạn cần phải đi, tôi hy vọng. Hãy nhớ đặt thuộc tính "Xây dựng" trên tệp hình ảnh của bạn thành "Tài nguyên"!

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