ItemsControl阻止项目内容扩展以填充其容器

时间:2014-03-30 07:48:00

标签: wpf

我正在创建一个继承自ItemsControl的WPF自定义控件。在我的控件的ControlTemplate中,我有一个ItemsPresenter。问题是我需要能够在项目演示者中获取内容以填充整个内容区域。在下面的代码中,我有一个破坏代码的简化示例,以及我想要完成的任务。 BTW设置Horizo​​ntalAlignment和VerticalAlignment to Stretch导致内容水平扩展但不垂直扩展。

<Window x:Class="yada"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="768" Width="1024">
    <Grid>
        <Grid.Resources>
            <Style TargetType="Border" x:Key="stepBorder">
                <Setter Property="Background" Value="CadetBlue"></Setter>
                <Setter Property="BorderBrush" Value="Green" ></Setter>
                <Setter Property="BorderThickness" Value="2"></Setter>
                <Setter Property="Padding" Value="25"></Setter>
            </Style>
        </Grid.Resources>
        <TabControl Margin="0,20,0,0">
            <TabItem Header="Broken">
                <Border>
                    <ItemsControl>
                        <ItemsControl.Items>
                            <Control>
                                <Control.Template>
                                    <ControlTemplate>
                                        <Border Style="{StaticResource stepBorder}">
                                            <TextBlock Text="Border fills small region near the top"></TextBlock>
                                        </Border>
                                    </ControlTemplate>
                                </Control.Template>
                            </Control>
                        </ItemsControl.Items>
                    </ItemsControl>
                </Border>
            </TabItem>

            <TabItem Header="Works">
                <Border>
                    <Control>
                        <Control.Template>
                            <ControlTemplate>
                                <Border Style="{StaticResource stepBorder}" >
                                    <TextBlock Text="Border fills entire control"></TextBlock>
                                </Border>
                            </ControlTemplate>
                        </Control.Template>
                    </Control>
                </Border>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

以下是我控制的一些代码。我不能把它包括在内,有太多了。我认为这是相关部分:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Wizard}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" x:Name="ContentRow" />
                            <RowDefinition Height="{Binding ElementName= NavButtonPanel,Path=ActualHeight}"></RowDefinition>
                        </Grid.RowDefinitions>
                        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" x:Name="ContentScrollViewer" MaxHeight="{Binding ElementName=ContentRowHeight, Path=ActualHeight}">
                            <ItemsPresenter 
                                x:Name="Presenter" 
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}">
                            </ItemsPresenter>
                        </ScrollViewer>

                        <Border Style="{TemplateBinding NavButtonPanelStyle}" Grid.Row="1" x:Name="NavButtonPanel">
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
                        </StackPanel>
                        </Border>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate></DataTemplate>
        </Setter.Value>
    </Setter>

1 个答案:

答案 0 :(得分:2)

像往常一样,只是张贴在SO上让我得到了答案的一半。

事实证明ItemsControl使用邪恶的stackpanel作为项目的容器。幸运的是,有一个名为ItemsPanel的绝密属性可以让你改变它。只需将其设置为网格,如下所示,您就可以开展业务了。

在我的情况下,我正在编写一个继承自ItemsControl的自定义控件,因此在样式中我添加了这个属性setter:

    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Grid></Grid>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>