2012-01-04 6 views
2

У меня есть RibbonBar с четырьмя кнопками, каждый из которых выбирает другой вид и вводит его в MainRegion. Сейчас он работает хорошо, но каждый из четырех видов имеет несколько общих элементов управления, например. Отображение имени пользователя, даты/времени, окна поиска и т. Д. На данный момент я сделал отдельные представления, но я хотел бы знать, есть ли способ реализации главной страницы/UserControl, так что мне не нужно повторять код ,Главная страница, но для регионов?

Так дизайн, прямо сейчас, так как:

Shell

<Window> 
    <Grid> 
     <DockPanel> 
      <RibbonBar Regions:RegionManager.RegionName="ToolbarRegion"> 
      </RibbonBar> 
      <ContentControl Regions:RegionManager.RegionName="MainRegion"> 
      </ContentControl> 
     </DockPanel> 
    </Grid> 
</Window> 

ToolbarRegion содержит RibbonBar с четырьмя кнопками.

Каждая кнопка вводит представление в MainRegion. Каждое из этих представлений имеет некоторые общие элементы управления (как и Master-страница в ASP.Net), но содержание каждого представления отличается.

Есть способы обойти это (я не могу изменить дизайн оболочки), но мне было интересно, есть ли лучший, более элегантный способ сделать это.

+0

Конечно, есть такой способ. Что вы пробовали? Вы пытались переместить свой общий контент на главную страницу и сохранять только фактический контент в под-представлениях? – chopikadze

+0

Как вы «вводите представление в MainRegion»? Какой метод вы используете?У меня очень близкое приложение, и я могу опубликовать базовую структуру, но сначала мне нужно знать, что вы используете сейчас :) – chopikadze

ответ

2

Мне нравится использовать рамки Prism, однако я считаю, что их регионы должны использоваться только для макета приложения (MenuRegion, NavigationRegion, ContentRegion и т.д.), а не навигации. Использование их для навигационных средств, позволяющих View контролировать поток приложений, и я считаю, что это работа для ViewModels.

Мой предпочитаемый метод для отображения меняющегося контента с DataTemplates и ContentControls

Чтобы создать что-то, как вы изложенные, я бы родитель ViewModel который содержит

  • ObservableCollection<IPageViewModel> PageViewModels
  • IPageViewModel SelectedPageViewModel

В области, в которой я хотел отобразить динамический контент, будет использоваться ContentControl s Уч как это:

<ContentControl Content="{Binding SelectedPage" /> 

И DataTemplates будет использоваться, чтобы сказать WPF, как рисовать каждый раздел

<DataTemplate TargetType="{x:Type local:Page1ViewModel}"> 
    <local:Page1View /> 
</DataTemplate> 

<DataTemplate TargetType="{x:Type local:Page2ViewModel}"> 
    <local:Page2View /> 
</DataTemplate> 

<DataTemplate TargetType="{x:Type local:Page3ViewModel}"> 
    <local:Page3View /> 
</DataTemplate> 

Я не использовал RibbonBar раньше, однако это звучит, как он должен позволить для ItemsSource так ваш конечный XAML должен, вероятно, выглядеть примерно так:

<Window> 
    <Grid> 
     <DockPanel> 
      <RibbonBar ItemsSource="{Binding PageViewModels}" 
         SelectedItem="{Binding SelectedPageViewModel}" 
         DockPanel.Dock="Top" ...> 

      </RibbonBar> 

      <StackPanel> 
       <Grid> 
        ... Generic Content 
       </Grid> 

       <ContentControl Content="{Binding SelectedPageViewModel}"> 

        <ContentControl.Resources> 
         <DataTemplate TargetType="{x:Type local:Page1ViewModel}"> 
          <local:Page1View /> 
         </DataTemplate> 
         <DataTemplate TargetType="{x:Type local:Page2ViewModel}"> 
          <local:Page2View /> 
         </DataTemplate> 
         <DataTemplate TargetType="{x:Type local:Page3ViewModel}"> 
          <local:Page3View /> 
         </DataTemplate> 
        </ContentControl.Resources> 

       </ContentControl> 
      </StackPanel> 
     </DockPanel> 
    </Grid> 
</Window> 
+0

Существует простой способ перемещения Навигация по ViewModel - с помощью метода IRegionManager.RequestNavigate(). В моем приложении я даже перемещаю его на Service :) – chopikadze

+0

@chopikadze Я пытался использовать «RegionManager» раньше и действительно ненавидел его из-за путаницы, вызванной этим, особенно с субрегионами и/или более крупными приложениями. Я думаю, что он отлично подходит для разметки различных регионов вашего приложения, однако я не использую его ни для чего другого. Это только я, хотя :) – Rachel

+0

Я попробовал это и проверил значение SelectedPage во время выполнения. Он был установлен правильно. Тем не менее, элемент управления содержимым не отображает представление, связанное с viewmodel. Для тестирования я не делал никаких изменений в Ribbonbar и просто тестировал этот метод для одного представления. –

1

содержание вашего Shell.xaml:

<Window ...> 
    <StackPanel> 
     <Grid> 
      <!-- Your shared content --> 
     </Grid> 
     <ContentControl prism:RegionManager.RegionName="MainRegion"/> 
    </StackPanel> 
</Window> 
+0

Это то, что я делал, но я не мог упомянуть, что у меня уже есть оболочка и четыре представления, которые я каждый из них будет введен в MainRegion, то есть я могу сделать другой регион в UserControl (который будет введен в MainRegion), но для того, чтобы вводить представления в этот SubRegion, мне пришлось бы ссылаться на эти под-представления в RibbonBar (который находится в другом регионе Shell). Я уточню свой вопрос, чтобы попытаться сделать его более ясным. –

Смежные вопросы