Перекрытие прозрачных видов в области призмы

Мне было интересно, есть ли способ показать два перекрывающихся прозрачных представления в одном названном регионе? В моем примере ниже показаны два перекрывающихся прозрачных представления в их собственном отдельном контейнере именованной области в первой строке сетки. Во втором ряду сетки у нас есть одна названная область «RegionC». Отображается первое зарегистрированное представление («ViewA»). Правильно ли я, что если у нас есть несколько представлений, зарегистрированных в регионе, тогда мы можем показывать только одно представление за раз? Есть ли способ показать два перекрывающихся представления в одном названном регионе? Или это стандартная практика - добавлять еще один элемент управления содержимым для поддержки нескольких отображаемых представлений? Одна из причин, по которой я хочу это сделать, заключается в том, что я могу лучше разделить свой код XAML на отдельные представления и при необходимости вставить их в один контейнер региона.

ShellWindow.xaml

<Window x:Class="PrismDemo.Views.ShellWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True"
    Title="{Binding Title}" Height="150" Width="325" >
<Grid ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <ContentControl Grid.Row="0"  prism:RegionManager.RegionName="RegionA" />
    <ContentControl Grid.Row="0"  prism:RegionManager.RegionName="RegionB" />
    <ContentControl Grid.Row="1"  prism:RegionManager.RegionName="RegionC" />
</Grid>

ShellWindow.xaml.cs

using Prism.Regions;
using System.Windows;

namespace PrismDemo.Views
{
    public partial class ShellWindow : Window
    {
        public ShellWindow(IRegionManager regionManager)
        {
            InitializeComponent();

            regionManager.RegisterViewWithRegion("RegionA", typeof(ViewA));
            regionManager.RegisterViewWithRegion("RegionB", typeof(ViewB));
            regionManager.RegisterViewWithRegion("RegionC", typeof(ViewA));
            regionManager.RegisterViewWithRegion("RegionC", typeof(ViewB));
        }
    }
}


ViewA.xaml

<UserControl x:Class="PrismDemo.Views.ViewA"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:PrismDemo.Views"
         mc:Ignorable="d" 
         d:DesignHeight="200" d:DesignWidth="300">
<TextBlock Text="ViewA" FontSize="20" />

ViewB.xaml

<UserControl x:Class="PrismDemo.Views.ViewB"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:PrismDemo.Views"
         mc:Ignorable="d" 
         d:DesignHeight="200" d:DesignWidth="300">
<TextBlock Text="ViewB" FontSize="30" />


person namg_engr    schedule 20.05.2020    source источник
comment
Используйте ItemsControl вместо ContentControl для RegionC.   -  person Suresh    schedule 20.05.2020
comment
Я пробовал это, но он просто складывает виды по вертикали и фактически не перекрывает их.   -  person namg_engr    schedule 20.05.2020
comment
Установите для свойства ItemsPanel значение Grid на ItemsControl.   -  person Suresh    schedule 20.05.2020
comment
Да, это так! Спасибо.   -  person namg_engr    schedule 20.05.2020


Ответы (2)


Вы должны использовать ItemsControl вместо ContentConrol для своего региона RegionC и установить его ItemsPanel на Grid.

Вот XAML:

    <ItemsControl Grid.Row="1"  prism:RegionManager.RegionName="RegionC">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid IsItemsHost="True" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
person Suresh    schedule 20.05.2020

Правильно ли я, что если у нас есть несколько представлений, зарегистрированных в регионе, тогда мы можем показывать только одно представление за раз?

Что касается регионов в ContentControl, да, вы правы, потому что одновременно может быть только один Content. Но в основном любой элемент управления может содержать область (при условии, что вы создаете связанный regionAdapter), например, ItemsControl или TabControl могут иметь несколько представлений внутри себя одновременно.

Есть ли способ показать два перекрывающихся представления в одном названном регионе?

Да, например, если вы укажете RegionAdapter вместо Grid.

Или это стандартная практика - добавлять еще один элемент управления содержимым для поддержки нескольких отображаемых представлений?

И да и нет. Стандарт для нескольких представлений в нескольких регионах, не стандарт для нескольких представлений в одном регионе.

person Haukinger    schedule 20.05.2020