Wpf Prism 为 ItemControl 的每个项目赋予样式(区域中的视图)

Wpf Prism give style to each items of a ItemControl (Views in a Region)

我有一个 WPF Prism 项目,它有一个 Region 基于 ItemControl:

<ItemsControl prism:RegionManager.RegionName="WorkspaceRegion" >

在这个 ItemControl 中,我看到我的一些 Views 垂直度很好,但我想给 ItemControl 的每个 Item 一个样式(每个 View ).

All of items (views) must have same style (for example: background color, padding, margin, border and...)

我想要这样的东西(例如):

我使用了这样一个简单的样式和代码:

<ItemsControl prism:RegionManager.RegionName="WorkspaceRegion"  Background="#765e4d" Margin="10">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border BorderBrush="Red" Padding="10" BorderThickness="1" CornerRadius="5">
                            <ContentPresenter Content="{Binding}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>

</ItemsControl>

它的错误:

A style intended for type 'ItemsControl' cannot be applied to type 'View1'

我也测试了这段代码:

<ItemsControl prism:RegionManager.RegionName="WorkspaceRegion"  Background="#765e4d" Margin="10">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid >
                <TextBlock Text="Test"/>
                <Border BorderBrush="Red" Padding="10" Margin="10" BorderThickness="1" CornerRadius="5">
                    <ContentPresenter Content="{Binding}"/>
                </Border>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

但是结果就像我写的那样:

<ItemsControl prism:RegionManager.RegionName="WorkspaceRegion" >


编辑1:

我用了 <ItemsPresenter/> 而不是 <ContentPresenter Content="{Binding}"/>

结果:没有任何变化


编辑2:

我为 ItemsControl 的 ItemContainerStyle 属性 编写了这种样式并且它有效 if 我从中删除了 ControlTemplate 部分。

现在的问题是我应该在下面的 ControlTemplate 中使用哪种 PresenterXaml Tag 我的 Views (UserControls) 显示。

   <Style TargetType="{x:Type UserControl}" x:Key="MyItemContainerStyle">
        <Setter Property="Background" Value="Brown"/>
        <Setter Property="BorderBrush" Value="Blue"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="Margin" Value="10"/>
        <Setter Property="Template" >
            <Setter.Value>
                <ControlTemplate>
                     ??????????????????????????
                    <!-- The following ContentPresenter not working and the Items dose not show -->
                    <ContentPresenter/> 
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这在我的测试应用程序中对我有用:

<ItemsControl Background="#FF85664F" prism:RegionManager.RegionName="WorkspaceRegion">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="DarkGray" Padding="10"
                    Margin="5, 5, 5, 0" BorderThickness="1"
                    CornerRadius="5" Background="#FFC3BF8F">
                <ContentPresenter Content="{Binding}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <system:String>ItemsControl Item #1</system:String>
    <system:String>ItemsControl Item #2</system:String>
    <system:String>ItemsControl Item #3</system:String>
    <system:String>ItemsControl Item #4</system:String>
    <system:String>ItemsControl Item #5</system:String>
</ItemsControl>

设置样式的ContentTemplate属性,不是Control.TemplateTemplate

ItemsControl 的呈现方式如下:

<ItemsControl>
    <ItemsPanel>
        <ContentPresenter>
            <ItemTemplate>
        </ContentPresenter>

        <ContentPresenter>
            <ItemTemplate>
        </ContentPresenter>

        <ContentPresenter>
            <ItemTemplate>
        </ContentPresenter>
    </ItemsPanel>
</ItemsControl>

ItemContainerStyle 适用于包装此 XAML 树中每个项目的 ContentPresenter 对象,我不相信 ContentPresenterControl.TemplateTemplate 属性。

更改 ContentPresenter 的显示方式时,您应该改写 ContentTemplate 属性。