Pergunta

A partir MSDN :

É provável que a maioria dos pontos de vista em seus módulos não terá de ser exibida diretamente, mas só depois de alguma ação por parte do utilizador. Dependendo do estilo de aplicação, você pode querer usar menus, barras de ferramentas ou outras estratégias de navegação para que seus usuários visualizações de acesso. No método de inicialização do módulo, você também pode registrar com estrutura de navegação do aplicativo. Nos manipuladores de eventos da sua estrutura de navegação (ou seja, quando um usuário clica em um item de menu), que você pode usar Visualização de técnicas de injeção para adicionar vistas para as regiões apropriadas.

Eu tenho um cenário semelhante, eu estou adicionando Vista para Regiões no método de inicialização do Módulo usando RegisterViewWithRegion. Eu adoraria para exibir uma visão baseada interação do usuário com um menu (que é um módulo diferente).

Como faço para conseguir este comportamento sem quebrar o comportamento dissociado de módulos em Prism?

É possível Activar / mostrar uma visão que foi adicionado a uma região, dizem por ModuleA de ModuleB?

Foi útil?

Solução

O que faço é criar um registro vista no meu Shell com a interface seguinte (estou simplificando aqui):

public interface IViewRegistry
{
     void RegisterView(string title, string key, Func<UIElement> viewCreationMethod);
     void OpenView(string key);
}

Esta é a maneira simplificar demais, mas espero que isto lhe dá uma imagem. Cada módulo registra seus pontos de vista com o shell usando essa interface na inicialização. Na minha shell, eu criar um ViewStore que armazena essas coisas.

public static class ViewStore
{
     public Dictionary<string, ViewEntry> Views { get; set; }
     static ViewStore()
     {
          Views = new Dictionary<string, ViewEntry>();
     }

     public void RegisterView(string name, string key, Func<UIElement> createMethod)
     {
         Views.Add(key, new ViewEntry() { Name = name, CreateMethod = createMethod });
     }
}

Depois de minha implementação IViewRegistry:

public class ViewRegistryService : IViewRegistry
{
     public void RegisterView(string title, string key, Func<UIElement> createMethod)
     {
          ViewStore.RegisterView(title, key, createMethod);
     }

     public void OpenView(string key)
     {
          //Check here with your region manager to see if
          //the view is already open, if not, inject it
          var view = _regionManager.Regions["MyRegion"].GetView(key);
          if(view != null)
          {
               view = ViewStore.Views[key]();
               _regionManager.Regions["MyRegion"].Add(view, key);
          }
          _regionManager.Regions["MyRegion"].Activate(view);
     }

     private IRegionManager _regionManager;
     public ViewRegistryService(IRegionManager rm)
     {
          _regionManager = rm;
     }
}

Agora eu tenho duas coisas:

  1. A ViewStore eu posso usar para criar um menu em minha concha.
  2. Uma forma de módulos para vistas panorâmicas de propriedade de outros módulos sem acoplamento além ModuleDependencies simples (na realidade, até mesmo o ModuleDependency não é necessário, mas provavelmente correta.

Obviamente desta forma simplifica as coisas. Eu tenho coisas que indicam se ou não uma visão deve ser um item de menu. Meu aplicativo tem vários menus, etc, mas isso é o básico e deverá fazê-lo indo.

Além disso, você deve dar Stackoverflow um pouco de uma chance de obter uma resposta ... só nos deu 3 horas antes de você desistiu:)

Espero que isso ajude.

Outras dicas

RegisterViewWithRegion não tem uma sobrecarga que aceitar Ver nome como parâmetro. Isso poderia ter facilitado integrando módulos. Eu adicionei um item de trabalho no Codeplex

Atualmente eu estou adicionando a referência a outros módulos para Ver Injection e perder natureza de baixo acoplamento de Prism

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top