2009-07-23 23 views
13

Cho rằng tôi có một ứng dụng vỏ và một vài dự án mô-đun riêng biệt sử dụng Microsoft CompoisteWPF (Prism v2) ...Composite WPF (Prism) tài nguyên module dữ liệu mẫu

Khi nhận lệnh, một module tạo ra một mới ViewModel và thêm nó vào một vùng thông qua trình quản lý vùng.

var viewModel = _container.Resolve<IMyViewModel>(); 
_regionManager.Regions[RegionNames.ShellMainRegion].Add(viewModel); 

Tôi nghĩ rằng tôi sau đó có thể tạo ra một từ điển tài nguyên trong các mô-đun và thiết lập một mẫu dữ liệu để hiển thị một cái nhìn đối với loại quan điểm mô hình đó đã được nạp (xem dưới đây XAML). Nhưng khi mô hình khung nhìn được thêm vào khung nhìn, tất cả những gì tôi nhận được là không gian tên của các kiểu khung nhìn được in ra.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:Modules.Module1.ViewModels" 
    xmlns:vw="clr-namespace:Modules.Module1.Views" 
> 
    <DataTemplate DataType="{x:Type vm:MyViewModel}"> 
     <vw:MyView /> 
    </DataTemplate> 
</ResourceDictionary> 

Edit:

tôi có thể làm cho nó hoạt động bằng cách thêm vào App.xaml

<Application.Resources> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="pack://application:,,,/Module1;component/Module1Resources.xaml"/> 
     <ResourceDictionary Source="pack://application:,,,/Module2;component/Module2Resources.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</Application.Resources> 

nào là tốt, nhưng nó có nghĩa là mô-đun như mới được tạo ra, App. tệp xaml cần được thêm vào. Những gì tôi đang tìm kiếm là một cách cho các mô-đun, khi chúng tải để tự động thêm vào các Application.Resources. Điều này có thể không?

Trả lời

5

Trong khởi động của mỗi mô-đun, bạn có thể thêm vào các nguồn tài nguyên ứng dụng:

Application.Current.Resources.MergedDictionaries 
       .Add(new ResourceDictionary 
       { 
        Source = new Uri(
         @"pack://application:,,,/MyApplication.Modules.Module1.Module1Init;component/Resources.xaml") 
       }); 

Hoặc nếu bạn làm theo một quy ước của mỗi mô-đun có một cuốn từ điển tài nguyên được gọi là "Resources.xmal" ...

protected override IModuleCatalog GetModuleCatalog() 
{ 
    var catalog = new ModuleCatalog(); 

    AddModules(catalog, 
       typeof (Module1), 
       typeof(Module2), 
       typeof(Module3), 
       typeof(Module4)); 

    return catalog; 
} 

private static void AddModules(ModuleCatalog moduleCatalog, 
    params Type[] types) 
{ 
    types.ToList() 
     .ForEach(x => 
      { 
       moduleCatalog.AddModule(x); 
       Application.Current.Resources.MergedDictionaries 
        .Add(new ResourceDictionary 
           { 
            Source = new Uri(string.Format(
                 @"pack://application:,,,/{0};component/{1}", 
                 x.Assembly, 
                 "Resources.xaml")) 
           }); 
       }); 
} 
+0

Phần đầu tiên của câu trả lời của bạn yêu cầu mô-đun của bạn tiếp cận với Ứng dụng. Tôi sẽ khuyên bạn nên chống lại điều này vì nó là không thể thực hiện được. Cách tiếp cận thứ hai là phù hợp hơn. –

19

Để tránh ứng dụng shell của bạn khỏi phải biết gì về module của bạn và các module của bạn từ vươn ra vào vỏ trong bất kỳ cách nào, tôi muốn cung cấp một giao diện để các module của bạn như thế này:

IMergeDictionaryRegistry 
{ 
    void AddDictionaryResource(Uri packUri); 
} 

Bạn 'd yêu cầu giao diện này trong mã Mô-đun của bạn:

public class MyModule : IModule 
{ 
    IMergeDictionaryRegistry _merger; 
    public MyModule(IMergeDictionaryRegistry merger) 
    { 
      _merger = merger; 
    } 

    public void Initialize() 
    { 
      _merger.AddDictionaryResource(new Uri("pack://application:,,,/Module1;component/Module1Resources.xaml"); 
    } 
} 

sau đó, bạn sẽ thực hiện điều này trong vỏ của mình để làm điều này:

public MergeDictionaryRegistry : IMergeDictionaryRegistry 
{ 
    public void AddDictionaryResource(Uri packUri) 
    { 
      Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() 
      { 
       Source = packUri; 
      }); 
    } 
} 

Và cuối cùng, trong ConfigureContainer của Bootstrapper của bạn:

public override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 
    Container.RegisterType<IMergeDictionaryRegistry, MergeDictionaryRegistry>(); 
} 

Điều này sẽ giúp bạn có được các chức năng bạn muốn Shell của bạn và Module của bạn sẽ vẫn độc lập với nhau. Điều này có lợi ích bổ sung là có thể thử nghiệm hơn ở chỗ bạn không cần phải quay số Application để kiểm tra mã mô-đun của bạn (chỉ cần giả lập IMergeDictionaryRegistry và bạn đã hoàn tất).

Hãy cho chúng tôi biết điều này phù hợp với bạn như thế nào.

+0

Cảm ơn. WPF biết cách render ViewModel bằng cách sử dụng DataTemplate (xem: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090097). Vấn đề là nhận được các ứng dụng để biết về DataTemplate trong một hội đồng khác. Tôi đã chỉnh sửa bài đăng để cung cấp thêm chi tiết. – Oll

+0

Ồ, tôi thấy những gì bạn đang làm. Bạn có thể phải cung cấp một số giao diện (IMergeDictionaryRegistration w/một phương thức chấp nhận một URL gói) cho các mô-đun của bạn và nối chúng vào từ điển tài nguyên của ứng dụng của bạn. Chỉ là một lý thuyết. –

+0

Ngoài ra ... Tôi tò mò làm thế nào điều này đi cho bạn. Hãy cho chúng tôi biết. Đó là một cách tiếp cận thú vị. –

1

Điều đó có vẻ như rất nhiều công việc!

Cá nhân, tôi chỉ khai báo một từ điển tài nguyên trong phần UserControl.Resources quan điểm của tôi như thế này ...

<UserControl.Resources> 
    <ResourceDictionary Source="../Resources/MergedResources.xaml" /> 
</UserControl.Resources> 

Đó sáp nhập điển sau đó trỏ tới bất kỳ tài nguyên Tôi cần phải bao gồm.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Iconography.xaml" /> 
    <ResourceDictionary Source="Typeography.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

Bạn muốn tuyên bố mẫu dữ liệu của bạn trong đó tôi đoán.

HTH.

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