سؤال

بالنظر إلى أن لدي تطبيق Shell واثنين من مشاريع وحدة منفصلة باستخدام Microsoft CompoistEwpf (Prism V2) ...

عند تلقي الأمر، يقوم الوحدة النمطية بإنشاء ViewModel جديد وأضيفها إلى منطقة من خلال مدير المنطقة.

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

اعتقدت أنني أستطيع بعد ذلك إنشاء قاموس للممارسة في الوحدة النمطية وإعداد قالب بيانات لعرض طريقة عرض لنوع عرض الرأي الذي تم تحميله (انظر أدناه XAML). ولكن عند إضافة نموذج الرأي إلى العرض، كل ما أحصل عليه هو علامة اسم نماذج الرأي المطبوعة.

<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>

تعديل:

يمكنني الحصول عليه للعمل عن طريق إضافة إلى التطبيق

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

وهو ما يرام، ولكنه يعني أنه نظرا لأن الوحدات النمطية الجديدة يتم إنشاؤها، يحتاج ملف App.xaml إلى إضافته إليه. ما أبحث عنه هو وسيلة للوحدات النمطية، حيث أنها تحمل إلى إضافة ديناميكيا إلى التطبيق. Resources. هل هذا ممكن؟

هل كانت مفيدة؟

المحلول 2

ضمن إبعاد كل وحدة نمطية، يمكنك إضافة موارد التطبيق:

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

أو إذا اتبعت اتفاقية كل وحدة لديها قاموس مورد يسمى "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"))
                              });
              });
}

نصائح أخرى

لتجنب تطبيق Shell الخاص بك من الاضطرار إلى معرفة أي شيء عن وحداتك وحجزك من الوصول إلى القشرة بأي شكل من الأشكال، سأوفر واجهة لنظمتك مثل هذا:

IMergeDictionaryRegistry
{
     void AddDictionaryResource(Uri packUri);
}

كنت تسأل عن هذه الواجهة في رمز الوحدة الخاص بك:

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");
     }
}

ستنفذ ذلك بعد ذلك في شلتك للقيام بذلك:

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

ثم أخيرا، في ConfigurEcontainer الخاص بك Bootstrapper:

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

سيحصل هذا على الوظيفة التي تريدها و ستبقى شلتك وهماكتك مستقلة عن بعضها البعض. هذا لديه فائدة إضافية من أن تكون أكثر قابلية للتحقق في ذلك ليس لديك حاجة لتدور Application لاختبار رمز الوحدة النمطية (فقط وهمية IMergeDictionaryRegistry وأنت انتهيت).

دعنا نعرف كيف يذهب هذا لك.

أن كل شيء يبدو وكأنه الكثير من العمل!

شخصيا، أنا فقط أعلن القاموس المورد في رأيي UserControl.Resources قسم مثل هذا ...

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

هذا القاموس المدمج ثم يشير إلى أي موارد أحتاج إلى تضمينها.

<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>

كنت تعلن قوالب البيانات الخاصة بك هناك أعتقد.

hth.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top