Я сделал нечто очень похожее, но, скорее всего, в совершенно другой отрасли, чем вы работаете.
Когда вы говорите размер / форму данных, я предполагаю, что вы не буквально говорите о кругах против квадратов, а вместо этого говорите, что у вас есть матрица данных NxM, и вы не знаете, что такое N и М до времени выполнения. Я также предполагаю, что вы хотите отобразить какой-то текст в каждой ячейке матрицы NxM.
Обратите внимание, что следующий XAML был изменен из моего кода и не тестировался, но я хотел дать вам общее представление о том, как я это сделал.
<ListBox Width="300" Height="300" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding Cells}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Width="Auto" Height="Auto" ItemWidth="{Binding CellBoundary}" ItemHeight="{Binding CellBoundary}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Width="{Binding CellDiameter}" Height="{Binding CellDiameter}" Text="{Binding CellValue}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Я изменил ItemsPanel ListBox, чтобы он был просто ListBox. Таким образом, пока у вас есть матрица NxM (она также может быть разреженной), вы рассматриваете ее как вектор с клетками NxM. Каждая ячейка фактически является элементом в ListBox.
Затем вы устанавливаете DataTemplate для каждого элемента ListBox как просто TextBlock, где размер TextBlock привязан к данным, а отображаемое значение находится в элементе CellValue
ваших ячеек, который является ObservableCollection<double>
или подобным, привязанным к данным. до Cells
.
Единственное, что вам нужно сделать в этой части кода, это выяснить, что такое N и M, и выполнить необходимые математические расчеты для вычисления размера ListBox (может быть внутри ViewBox, чтобы сделать его масштабируемым) , так что значения отображаются соответственно. Очевидно, вам нужно изменить мои жестко запрограммированные значения на что-то привязанное к данным.
Этот подход кажется мне самым простым, чтобы обернуть свой мозг, поэтому я использовал его для своих вещей.
Я должен также добавить, что для создания разреженной матрицы вы должны установить CellValue на 0, но вы также можете использовать DataTrigger, чтобы сделать TextBlocks невидимыми, если значение равно 0, создавая иллюзию разреженной матрицы. .