Откройте вторую оболочку в приложении prism v4 WPF (регионы) - PullRequest
4 голосов
/ 06 декабря 2010

У меня есть приложение-призма, содержащее Shell.xaml (с MainRegion), ShellViewModel.cs.

Это окно оболочки открывается при запуске приложения.Теперь я хочу открыть второе всплывающее окно, содержащее то же самое окно оболочки (Shell.xaml, ShellViewModel).

Определение оболочки похоже на пример призмы StockTraderRI.Shell.xaml содержит MainRegion (очень упрощенный источник):

<Window x:Class="Bsoft.Test.Shell"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cal="http://www.codeplex.com/CompositeWPF" 
    Title="MainWindow" Height="550" Width="825">
  <Grid>
    <ContentControl cal:RegionManager.RegionName="MainRegion"/>
  </Grid>
</Window>

Код позади содержит только базовую ссылку ViewModel:

namespace Bsoft.Test.bmedApp
{
  [Export]
  public partial class Shell : Window
  {
    [ImportingConstructor]
    public Shell()
    {
      InitializeComponent();
    }

    [Import]
    ShellViewModel ViewModel
    {
      set
      {
        this.DataContext = value;
      }
    }
  }
}

ShellViewModel автоматически вставляется загрузчиком MEF:

namespace Bsoft.Test.bmedApp
{
  [Export]
  public class ShellViewModel : NotificationObject
  {
    [ImportingConstructor]
    public ShellViewModel()
    {
    }
  }
}

Это работает так, как задумано.

Теперь я хочу во второй раз открыть окно оболочки в качестве всплывающего окна.Достаточно просто пометить Shell и ViewModel как не используемые совместно, используя:

[PartCreationPolicy(CreationPolicy.NonShared)]

Но мои проблемы:

1) Я загружаю другие View (Модели) в MainRegion.Как мне сообщить программе, нужно ли загружать View (Model) в основной Shell MainRegion или во всплывающее окно MainRegion?Я предполагаю, что мне нужны RegionManager с областями видимости, но я понятия не имел, как их использовать для этого.

2) У меня есть некоторые события (EventAggregator) для представлений, загруженных в регион для передачи уведомлений и команд (статусОбновление, просмотр закрытия, ошибки) для Shell, чтобы сообщить.Как я могу отделить основные события оболочки от событий всплывающего окна (так как оба являются одной и той же оболочкой)?

Я хочу иметь возможность открывать несколько всплывающих окон, поэтому использование разных имен регионов для обоихдостаточно для меня, мне нужно больше разделения.Может быть, есть способ создать отдельную внутреннюю структуру призмы / mef / region / container ??

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

То, что вы пытаетесь достичь, возможно, хотя могут быть некоторые вещи, которые я не совсем понимаю в вашем подходе.

Я предполагаю, что когда вы говорите о наличии двух оболочек, вы на самом деле имеете в виду наличие двухактивные окна одновременно.

Есть много способов , чтобы достичь этого в Prism, так что давайте продолжим с вашими сомнениями.

Для (1) лучшая вещьЯ могу подумать о создании другого экземпляра диспетчера регионов и присоединении его к другому Shell (всплывающему).Это похоже на работу с областями области действия (как если бы у вас был отдельный RegionManager), но вы создаете менеджер и вместо этого присоединяете его к командной консоли.Затем зарегистрируйте новый RegionManager в MEF со строковым идентификатором, чтобы можно было отличить его от MainWindow RegionManager и просто добавить регионы в правильный диспетчер регионов.

(2) - это другая тема, которую вы пытаетесь получитьодин и тот же код, чтобы вести себя по-разному.Возможно, если вам требуется такое различное поведение, использование одного и того же класса Shell для обоих окон - не лучший подход.Если вам требуется такая дифференцируемость, но вы все равно хотели бы повторно использовать код, я бы порекомендовал использовать некоторую форму наследования и комбинировать виртуальные методы в BaseShell с методами шаблонов для выполнения действий, которые различны для каждой оболочки.

Я надеюсь, что это иллюстрирует мою точку зрения.

1 голос
/ 07 декабря 2010

Я не совсем понимаю, что вы подразумеваете под открытием двух оболочек? Если вы запускаете приложение silverlight в двух разных окнах или у вас есть 2 экземпляра приложения WPF, тогда ваши оболочки не конфликтуют. Даже если у вас есть одно приложение с 2 экземплярами Bootstrapper, конфликт отсутствует - ваши две оболочки работают совершенно независимо. Дайте мне знать, поможет ли это.

...