2012-05-10 19 views
5

Tôi có thành phần MEF nhập được tải động khi trình hướng dẫn nhập mở ra. Ngay sau khi người dùng chọn loại nhập khẩu mà cô ấy muốn xử lý, kiểm soát hộp thoại trình hướng dẫn nhập được chuyển đến thành phần nhập đã chọn. Tất nhiên, các thành phần nhập khẩu cần cung cấp tài nguyên cho hộp thoại wizard (e. G. DataTemplate s). Tại thời điểm này được thực hiện thông qua DataTemplateSelector s được cung cấp bởi các thành phần nhập khẩu. Họ truy cập vào một địa phương ResourceDictionary của hội đồng thành phần nhập khẩu.Cách cung cấp tài nguyên XAML từ các thành phần MEF

Nhưng như bạn có thể tưởng tượng, điều này thật tẻ nhạt: tôi phải thêm mã cho mỗi DataTemplate để cung cấp, WPF không tự động sử dụng quyền DataTemplate theo loại ViewModel đang được hiển thị.

Có ai đã giải quyết vấn đề này trước đây không? Các bạn có thể cung cấp tài nguyên trong môi trường trình cắm thêm bằng cách nào?

Cảm ơn bạn đã giúp đỡ trước.

Trân trọng

Trả lời

13

Tôi mất dấu vết nơi tôi tìm thấy mẹo nhỏ này, nhưng một điều bạn có thể làm là tự động nhập từ điển tài nguyên khi bạn soạn các hội đồng bên ngoài.

Trong mỗi lắp ráp với nguồn lực, bạn xuất một hoặc ResourceDictionary nhiều đối tượng bằng cách mã sau và chú thích như thế này:

[Export(typeof(ResourceDictionary))] 
public partial class Resources : ResourceDictionary 
{ 
    public Resources() 
    { 
     InitializeComponent(); 
    } 
} 

Bây giờ bạn cần một thành phần mà giải quyết một [ImportMany] IEnumerable<ResourceDictionary> resourceDictionaries và làm điều gì đó như thế này:

 //Merge exported resource dictionaries from all composed sources into the application 
     foreach (var resourceDictionary in resourceDictionaries) 
     { 
      Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); 
     } 
+0

Về cơ bản tôi đã thử ý tưởng đó. Tôi đã sao lưu 'ResourceDictionary' của mình bằng một tệp lớp, do đó có thể nhanh chóng diễn đạt nó. Một trang thuật sĩ bây giờ có thể hợp nhất từ ​​điển đó để "nhập" tài nguyên của nó. Cảm ơn nhiều. – oddparity

+0

Ý tưởng chung để có một mã phía sau cho một từ điển tài nguyên là khá mới đối với tôi ... điều này mở ra một thế giới đầy đủ các cơ hội, tốt đẹp nhất. – grek40

0

Nếu thành phần nhập khẩu của bạn sẽ được chỉ chứa trong khu vực cụ thể của ứng dụng của bạn, sau đó bạn có thể thêm chỉ DataTemplate cho ViewModel gốc của thành phần để Tài nguyên của một FrameworkElement đại diện cho một khu vực mà thành phần sẽ được đặt. Tất cả các DataTemplates khác (đối với các ViewModels khác trong thành phần được nhập khẩu) sau đó sẽ được chứa trong các Tài nguyên của DataTemplate cho ViewModel gốc của thành phần.

+0

Điều này ngụ ý tôi khai báo 'DataTemplate' cho phần tử gốc của thành phần' ViewModel' trong chương trình chính, phải không? Tôi muốn có những "chi tiết thực hiện" của thành phần nằm trong hội đồng thành phần. – oddparity

+0

No. Tôi nghĩ rằng FrameworkElement đại diện cho khu vực nơi thành phần sẽ được định vị sẽ được chuyển đến mã của thành phần như một tham số. Khai báo DataTemplate cho ViewModel gốc của thành phần trong chương trình chính sẽ không có ý nghĩa, vì nó sẽ không làm cho ứng dụng có thể tổng hợp được. – Stipo