Wpf 如何使用ItemsControl和UniformGrid填充可用空间?

Wpf 如何使用ItemsControl和UniformGrid填充可用空间?,wpf,Wpf,我想使用一个带有统一模板的ItemsControl,它有4行3列。我想填满所有可用的空间,所以如果我改变窗口的大小,它应该填满所有的空间 我的ItemsControl是这样的: <Viewbox Stretch="UniformToFill" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="1"> <It

我想使用一个带有统一模板的ItemsControl,它有4行3列。我想填满所有可用的空间,所以如果我改变窗口的大小,它应该填满所有的空间

我的ItemsControl是这样的:

<Viewbox Stretch="UniformToFill" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="1">
    <ItemsControl Background="Yellow" Name="icCalendarios" ItemsSource="{Binding Calendarios}" Margin="0,0,30,0" HorizontalAlignment="Center" VerticalAlignment="Stretch" Grid.Row="1">

        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="4" Columns="3" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>

        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <myControls:MyControl VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Viewbox>

这是我的控制:

<DockPanel>
    <Viewbox Name="vbReescalado" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,0,0,0" Stretch="UniformToFill"
             Width="{Binding ElementName=MesConEventos, Path=WidthReescalado}">
        <DockPanel>
            <TextBlock Text="{Binding Date}" />

            <Grid Height="30" DockPanel.Dock="Top">
                <TextBox Foreground="Black" Name="txtEncabezado" FontSize="12"
                                         BorderBrush="Transparent" BorderThickness="0" Background="Transparent"
                                         VerticalAlignment="Center" TextAlignment="Center" HorizontalAlignment="Stretch"
                                         Padding="25,0,0,0"
                                         Text="{Binding Encabezado}"/>
            </Grid>


            <ItemsControl ItemsSource="{Binding NombresDias}" DockPanel.Dock="Top" Grid.Column="1">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock TextAlignment="Center" Text="{Binding}" FontSize="8"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>

                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Rows="1" Columns="8" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>

            <ItemsControl ItemsSource="{Binding Dias}" Grid.Column="1" Margin="0,0,0,0">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Border BorderThickness="0.25" Padding="0,0,0,0" Margin="0,0,0,0"
                                                BorderBrush="{Binding Converter={StaticResource ColorRecuadroDiaConverter}}"
                                                Width="25" Height="25">

                            <Border Name="InnerBorder" Background="{Binding ColorDia}" BorderBrush="{Binding Path=ColorRecuadroExterno}" BorderThickness="{Binding Path=GrosorRecuadroExterno}" Padding="0,0,0,0" Margin="0,0,0,0">
                                <DockPanel>
                                    <!--Número de día.-->
                                    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" FlowDirection="RightToLeft">
                                        <TextBox TextAlignment="Center" BorderBrush="Transparent" Background="Transparent" Text="{Binding Path=., Converter={StaticResource DateConverter}}" FontSize="5" Margin="0,0,0,0" Padding="0,0,0,0">
                                            <TextBox.Style>
                                                <Style TargetType="{x:Type TextBox}">
                                                    <Style.Triggers>
                                                        <DataTrigger Binding="{Binding IsTargetMonth}" Value="false">
                                                            <Setter Property="TextBlock.Foreground" Value="Gray"></Setter>
                                                        </DataTrigger>
                                                    </Style.Triggers>
                                                </Style>
                                            </TextBox.Style>
                                        </TextBox>
                                    </StackPanel>


                                    <TextBox IsEnabled="{Binding IsEnabled}" FontSize="2.5" Height="18" AcceptsReturn="True" TextWrapping="Wrap" BorderThickness="0" ScrollViewer.VerticalScrollBarVisibility="Disabled"
                                                             Background="{x:Null}"
                                                             Foreground="{Binding Path=ColorTexto}"
                                                             Text="{Binding Path=Notes}"/>

                                </DockPanel>
                            </Border>
                        </Border>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <UniformGrid Rows="6" Columns="8" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </DockPanel>
    </Viewbox>
</DockPanel>

但在这种情况下,MyControl不调整为parent,我必须手动设置大小,因为如果不调整,则不会显示

如何根据可用空间调整月份


谢谢。

UniformGrid
始终使用自动大小测量其内容,除非设置了固定大小,因此很难实现此行为。如果您有固定数量的行和列,我将使用
Grid
。棘手的部分是动态设置
Grid.Row
Grid.Column
。下面是一个非常简单的样式绑定测试:

    <ItemsControl x:Name="cntrl">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                </Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Grid.Row" Value="{Binding Row}" />
                <Setter Property="Grid.Column" Value="{Binding Col}" />
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
cntrl.ItemsSource = Enumerable.Range(0, 12).Select(s => new { Row = s % 3, Col = s % 4});