2010-09-20 44 views
16

Trong dự án WPF của tôi, tôi giữ quyền kiểm soát người dùng trong một dự án thư viện riêng biệt. Việc kiểm soát người dùng truy cập các nguồn lực trong một file XAML riêng biệt, như thế này:WPF UserControl không thể tìm thấy tài nguyên XAML khi tham chiếu dự án

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/Resources/ViewResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <!-- Local styles here --> 
    </ResourceDictionary> 
</UserControl.Resources> 

các tập tin tài nguyên, ViewResources.xaml, nằm trong một thư mục trong dự án thư viện kiểm soát tên Tài. Nó có hành động xây dựng mặc định (Trang) và công cụ tùy chỉnh (MSBuild: Biên dịch).

Vấn đề là khi tôi tham khảo thư viện điều khiển trong ứng dụng WPF của tôi và sử dụng điều khiển người dùng. Khi chạy, tôi nhận được XamlParseException sau:

Set property 'System.Windows.ResourceDictionary.Source' threw an exception. 

... mà kết thúc tốt đẹp các IOException:

Cannot locate resource 'resources/viewresources.xaml'. 

Làm thế nào tôi có thể sửa lỗi này? Tôi đã cố gắng thay đổi hành động xây dựng của tệp tài nguyên thành "nội dung" và sao chép nó vào thư mục đầu ra (hoạt động cho các tệp và các tài nguyên "câm" tương tự). Nhưng không có kết quả. Ngoài ra, nó không hoạt động tài sản trong điều khiển người dùng sau đó.

Có cách nào tốt hơn để chỉ định đường dẫn không?

Tôi có phải di chuyển tệp tài nguyên đến dự án ứng dụng (tôi không muốn, vì nó thuộc về miền của người dùng kiểm soát).

Trả lời

25

Tìm thấy.

Bật ra có cách tốt hơn để chỉ định đường dẫn, Pack URIs. Tôi đã thay đổi XAML thành những điều sau đây:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <!-- Local styles here --> 
    </ResourceDictionary> 
</UserControl.Resources> 

và điều đó đã sửa nó.

+4

Là một phím tắt cho bất kỳ ai khác tìm thấy này, tôi đã thay đổi 'Themes \ AvalonDockTheme.xaml' cho 'gói: // ứng dụng: ,,,/Themes/AvalonDockTheme.xaml' kể từ khi tham chiếu XAML ở trong cùng một hội đồng. Cảm ơn, Tor! –

+1

Tôi không thể có được điều này để làm việc cho UserControls của tôi sử dụng tài nguyên. Vì vậy, tôi chỉ đơn giản sử dụng PropertyGrid để chọn tài nguyên Xaml của tôi từ một trình đơn thả xuống - nó dẫn đến một định dạng như sau: '' làm việc cho tôi. – Adam

+0

Liên kết bị hỏng. MSDN cho biết nội dung không còn nữa. Để khắc phục điều đó, hãy chọn nội dung cho ".NET 4.0" trên trang. Đây là liên kết trực tiếp: https://msdn.microsoft.com/en-us/library/aa970069%28v=vs.100%29.aspx – ygoe

24

Tôi nghĩ là đáng để đăng bài này chỉ trong trường hợp bất cứ ai đang đấu tranh với cùng một vấn đề, vì tôi đã dành hơn hai giờ chiến đấu với cú pháp, v.v. chỉ để thấy rằng giải pháp đã chết đơn giản, nhưng không phải rõ ràng: Khi tham chiếu một tài nguyên được đóng gói từ một thư viện điều khiển khác, nó có vẻ hoạt động tốt ở thời gian thiết kế và thậm chí biên dịch mà không có lỗi, nhưng không thành công khi chạy với 'Thuộc tính' System.Windows.ResourceDictionary.Source 'ném một ngoại lệ' lỗi. Nó chỉ ra rằng chỉ đơn giản là tham khảo lắp ráp tài nguyên từ thư viện điều khiển của bạn là không đủ, bạn CSONG cần thêm một THAM KHẢO vào assembly có chứa từ điển tài nguyên trong assembly chính của bạn, có vẻ như nó không được biên dịch vào ứng dụng . (ví dụ: Ứng dụng khởi động (ứng dụng có app.xaml) -> Thêm tham chiếu -> chọn tập hợp với các tệp tài nguyên tham chiếu/s).

Hy vọng điều này sẽ hữu ích!

+1

người đàn ông, bạn đã lưu hai giờ cuộc đời của tôi. Cảm ơn rất nhiều – Artiom

+0

người đàn ông, nó phải là một phần của câu trả lời! Đã bỏ phiếu! :) – StepUp

+0

Tôi upvote điều này nhiều hơn một lần nếu tôi có thể, một người đàn ông tốt đẹp! – DAAlex

0

Tôi có cùng hoàn cảnh, nhưng URI gói không giúp tôi, tôi vẫn nhận được ngoại lệ "Không thể định vị tài nguyên ..." trong dự án tham chiếu (thực thi). Điều gì đã giúp tôi, là cài đặt các tệp ResourceDictionary của tôi trong dự án thư viện điều khiển tùy chỉnh là Tài nguyên được nhúng.

6

Trong trường hợp của tôi, tôi đã có ResourceDictionary và UserControl trên cùng một Thư viện, nhưng tách biệt khỏi ứng dụng chính. Những gì làm việc cho tôi đã được xác định tên của hội đồng trong các định dạng Adam đề nghị trong bình luận và tôi đã phải thay đổi ResourceDictionary trong dự án từ Embedded Resource đến Page. Tôi đã không thử sử dụng định dạng gói: //, nhưng tôi cho rằng nó cũng hoạt động.

<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/> 
+0

Cảm ơn - việc đổi thành Trang đã hoạt động cho tôi. –

+0

Tôi đã thay đổi tài nguyên của mình để cố gắng làm cho nó hoạt động. đã thử một số định dạng ở đây cho cùng một tài nguyên lắp ráp, điều này đã làm việc cảm ơn. '' – Maslow

1

tôi đã có lỗi tương tự (IOException - không tìm thấy file), trong đó chi phí cho tôi một ngày trong đời tôi mà tôi sẽ không bao giờ quay trở lại.

Không sử dụng cú pháp "/assemblyname ..." cũng như cú pháp "gói: // ...." đã hiệu quả đối với tôi.

Tôi đã tham khảo lắp ráp tài nguyên trong cụm chính của mình một cách chính xác.

Lỗi đã biến mất khi tôi thay đổi tệp tài nguyên xaml của mình Xây dựng thuộc tính Action thành "Tài nguyên", như đã đề cập ở trên.

Tuy nhiên, tôi sau đó gặp một XamlParseException tại dòng này:

<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />

(mà tôi đã tay, đánh máy).

Điều này đã để lại tệp tài nguyên xaml mà tôi đang cố gắng bao gồm với sự phụ thuộc không hợp lệ một cách hiệu quả.

Oddly khắc phục là xóa thuộc tính ImageSource mà tôi đã nhập, chèn lại BUT chọn hình ảnh từ trình đơn thả xuống xuất hiện như là kết quả.

Mặc dù dòng kết quả xuất hiện giống hệt nhau, rõ ràng là không.

Bắt đầu không thích WPF (VS2013), nhưng hy vọng điều này sẽ hữu ích.

: 0/

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