Я пытаюсь реализовать диаграмму с подвижными / изменяемыми размерами частями в WPF.
Я хотел бы использовать ItemsControl с ItemsPanel, настроенным как «DynamicCanvas».
Все, что вам нужно знать о DynamicCanvas прямо сейчас, это то, что он действует как обычный холст - за одним исключением - он использует вложенные свойства для хранения информации об атрибутах X, Y на своих дочерних элементах.
Мой код:
<ItemsControl IsTabStop="False" ItemsSource="{Binding ElementName=comboBox1,Path=SelectedItem.Source.Table}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<s:TableControl Table="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<!--<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">-->
<c:DynamicCanvas SizeHeightToContent="True" SizeWidthToContent="True" ClipToBounds="True" SnapsToDevicePixels="True" PreviewMouseDown="Canvas_MouseDown" IsHitTestVisible="True" Background="Gray" >
</c:DynamicCanvas>
<!--</ScrollViewer>-->
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Элементы управления, отображаемые в DynamicCanvas, относятся к моему пользовательскому типу (ниже только самая важная часть):
<ContentControl x:Class="SubiektCommerceSynchro.ViewModel.TableControl"
c:DynamicCanvas.Left="{Binding X,Mode=TwoWay}"
c:DynamicCanvas.Top="{Binding Y,Mode=TwoWay}"
Width="450" Height="300"
></ContentControl>
Теперь проблема и вопрос:
Часть, которая здесь не работает, связана с прикрепленными свойствами c: DynamicCanvas.Left (Top).
Давайте рассмотрим это поэтапно:
1) DynamicCanvas ожидает, что у его непосредственных потомков будут определены c: DynamicCanvas.Left и c: DynamicCanvas.Top
2) ItemsPanel при помещении TableControls на DynamicCanvas оборачивает их в какой-то контейнер
3) DynamicCanvas не видит прикрепленных свойств в своих непосредственных дочерних элементах => обрабатывает их как расположенные в точке (0,0) и делает их фактически неподвижными.
Как я могу решить эту проблему?