Главная страница, но для регионов? - PullRequest
2 голосов
/ 04 января 2012

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

Итак, сейчас дизайн выглядит так:

Оболочка

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

Панель инструментов содержит панель с четырьмя кнопками.

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

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

Ответы [ 2 ]

2 голосов
/ 04 января 2012

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

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

.что-то, как вы обрисовали в общих чертах, у меня будет родительский ViewModel, который содержит

  • ObservableCollection<IPageViewModel> PageViewModels
  • IPageViewModel SelectedPageViewModel

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

<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 раньше, однакопохоже, что он должен учитывать ItemSource, поэтому ваш окончательный 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>
1 голос
/ 04 января 2012

Содержимое вашего Shell.xaml:

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