0

请原谅长度,试图确保所有信息都包含在内!

我需要一个几乎像这样的圆圈的单元视图(具有相应 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>

还有我的 RowView:

<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 个单元格,每个单元格的大小相同,但尽管设置了 Horizo​​ntalAlignment,但所有内容都向左对齐,大概是因为它附加了空白单元格。我假设我可以在我想要的地方插入空白单元格,但这感觉就像是数据的软糖以使显示正确,我相信你会同意这是不好的。

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

谢谢你的耐心。

4

1 回答 1

0

好吧,也许这是不可能的?我最终向 ViewModel 添加了一个属性,该属性构建网格并在生成期间分配适当的行/列,然后将内容控件数据绑定到该网格。

它仍然没有解决 - 如何在 XAML 中做到这一点?

风景:

<Viewbox Stretch="Uniform">
    <ContentControl Content="{Binding PrettyGrid}" />
</Viewbox>

在视图模型中:

public Grid PrettyGrid
{
    get
    {
        return BuildGrid(data);
    }
}

和 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;
}
于 2012-08-09T12:31:07.283 回答