Wpf 通用、可装订、统一拉伸布局

Wpf 通用、可装订、统一拉伸布局,wpf,xaml,Wpf,Xaml,请原谅长度,尽量确保包含所有信息 我需要一个单元格视图(一个具有相应VM的视图),几乎是一个圆形,如下所示: ******** ********** ************ ************** ************** ************** ************** ************ ********** ******** 其中一些复杂因素: 在我们启动之前,我不知道要显示多少单元格。所有单元格的大小必须相等。整个视图必须是可伸缩的

请原谅长度,尽量确保包含所有信息

我需要一个单元格视图(一个具有相应VM的视图),几乎是一个圆形,如下所示:

   ********
  **********
 ************
**************
**************
**************
**************
 ************
  **********
   ********
其中一些复杂因素: 在我们启动之前,我不知道要显示多少单元格。所有单元格的大小必须相等。整个视图必须是可伸缩的

在我的简化世界中,我的窗口创建20个RowViewModel对象,并向每个构造函数传递它应该创建的列数

我的主要观点是:

<Viewbox Stretch="Uniform">
    <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}},Path=Rows}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="{Binding Path=Rows.Count}" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Viewbox>

我的观点是:

<Grid>
    <ItemsControl ItemsSource="{Binding Columns}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Columns="{Binding Columns.Count}"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

我的手机视图:

<Border >
    <Viewbox Stretch="Uniform" >
        <Label FontSize="10" Content="{Binding Notice}" Foreground="White" />
    </Viewbox>
</Border>

目前,所有行的宽度都相同,因此单元格较少的行的单元格宽度更大。如果我告诉每行有20个单元格,每个单元格的大小都相同,但不管水平对齐设置如何,所有单元格都向左对齐,大概是因为它附加了空白单元格。我假设我可以在我想要的地方插入空白单元格,但这感觉像是对数据的篡改,以确保正确显示,我相信你会同意这是B-a-D

我尝试过无数种方法,认为这是迄今为止最接近的方法,但我错过了。你能帮忙吗


谢谢你的耐心。

嗯,也许这是不可能的?最后,我向ViewModel添加了一个属性,该属性构建网格并在生成过程中指定适当的行/列,然后将contentcontrol数据绑定到该网格

它仍然没有解决-如何在XAML中实现它

观点:

<Viewbox Stretch="Uniform">
    <ContentControl Content="{Binding PrettyGrid}" />
</Viewbox>
以及BuildGrid代码片段:

private static Grid BuildGrid(List<objects> cellData)
{
    var localGrid = new Grid();

    // ...

    localGrid.RowDefintions.Add(...);
    localGrid.ColumnDefinitions.Add(...);

    cellData.ForEach(cell => 
    {
        ContentControl ctl = new ContentControl();
        ctl.Content = cell;
        Grid.SetRow(ctl, cell.Row);
        Grid.SetColumn(ctl, cell.Column);
        localGrid.Children.Add(ctl);
    });

    return localGrid;
}
私有静态网格BuildGrid(列出cellData)
{
var localGrid=new Grid();
// ...
localGrid.rowDefinitions.Add(…);
localGrid.ColumnDefinitions.Add(…);
cellData.ForEach(cell=>
{
ContentControl ctl=新的ContentControl();
ctl.内容=细胞;
Grid.SetRow(ctl,cell.Row);
Grid.SetColumn(ctl,cell.Column);
localGrid.Children.Add(ctl);
});
返回localGrid;
}
private static Grid BuildGrid(List<objects> cellData)
{
    var localGrid = new Grid();

    // ...

    localGrid.RowDefintions.Add(...);
    localGrid.ColumnDefinitions.Add(...);

    cellData.ForEach(cell => 
    {
        ContentControl ctl = new ContentControl();
        ctl.Content = cell;
        Grid.SetRow(ctl, cell.Row);
        Grid.SetColumn(ctl, cell.Column);
        localGrid.Children.Add(ctl);
    });

    return localGrid;
}