prism - область, не загружающая содержимое usercontrol в оболочке - PullRequest
0 голосов
/ 19 марта 2012

Я пытался выучить призму, но я не могу заставить работать очень простой пример. У меня есть Shell, который имеет один регион. Я пытаюсь загрузить вид из модуля в область оболочки, но оболочка показывает пустое окно. Я просто не могу понять, почему представление не загружается в область оболочки. Вот файлы кода.

Загрузчик:

public class Bootstrapper : MefBootstrapper {

    protected override DependencyObject CreateShell() {
        Window shell = new MainWindow();
        Application.Current.MainWindow = shell;
        return shell;
    }

    protected override IModuleCatalog CreateModuleCatalog() {
        return new ConfigurationModuleCatalog();
    }
}

Shell:

<Window x:Class="MVVMPractice.MainWindow">
    <StackPanel x:Name="LayoutRoot" Background="White">
        <ContentControl prism:RegionManager.RegionName="MainRegion" />
    </StackPanel>
</Window>

Модуль:

[ModuleExport(typeof(CoreModule))]
public class CoreModule : IModule {

    [Import]
    public IRegionManager RegionManager { get; set; }

    public void Initialize() {
        var view = new WelcomeView();
        RegionManager.AddToRegion("MainRegion", view);
    }
}

Просмотр для загрузки в регионе:

<UserControl x:Class="MVVMPractice.Modules.Core.WelcomeView">

<Grid Background="Red">
    <TextBlock Text="Hello Prism!" FontSize="20" />
</Grid>
</UserControl>

Приведенный выше вид должен отображаться в оболочке, но это не так. Любые идеи, почему регион оболочки не показывает вышеупомянутый вид?

EDIT: Модуль настраивается через файл App.config, как показано ниже.

App.config

<configuration>
  <configSections>
    <section name="modules" type="Microsoft.Practices.Prism.Modularity.ModulesConfigurationSection, 
                                  Microsoft.Practices.Prism"/>
  </configSections>
  <modules>
    <module assemblyFile="MVVMPractice.Modules.Core.dll" 
            moduleType="MVVMPractice.Modules.Core.CoreModule, MVVMPractice.Modules.Core.CoreModule, 
                       Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 
            moduleName="CoreModule" 
            startupLoaded="true" />
  </modules>
</configuration>

1 Ответ

1 голос
/ 19 марта 2012

Это работает для меня, хотя я еще не пытался использовать конфигурацию app.config:

public class Bootstrapper : MefBootstrapper
{
    #region Overrides of Bootstrapper

    protected override DependencyObject CreateShell()
    {
        return Container.GetExportedValue<MainWindow>();
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();

        Application.Current.MainWindow = (MainWindow) Shell;
        Application.Current.MainWindow.Show();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return new ConfigurationModuleCatalog();
    }

    protected override void ConfigureAggregateCatalog()
    {
        base.ConfigureAggregateCatalog();

        AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof (Bootstrapper).Assembly));
        AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(CoreModule).Assembly));
    }

    #endregion
}

// Основной модуль такой же, как ваш

// Главное окно (Shell)

<ContentControl prism:RegionManager.RegionName="MainRegion"  />

Ваш Xaml работает, но поскольку вы использовали StackPanel, область не заполняет представление.

...