我正在尝试在WPF中实现带有可移动/可调整大小的部分的图表。 我想将ItemsConnel与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)将TableControl放到DynamicCanvas上的ItemsPanel将它们包装在某种容器中
3)DynamicCanvas在其直接子节点上看不到附加属性=&gt;将它们视为位于(0,0)并使它们无法移动。
如何解决此问题?
答案 0 :(得分:3)
这有帮助吗?
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="c:DynamicCanvas.Left"
Value="{Binding X,Mode=TwoWay}"/>
<Setter Property="c:DynamicCanvas.Top"
Value="{Binding Y,Mode=TwoWay}"/>
</Style>
</ItemsControl.ItemContainerStyle>
答案 1 :(得分:1)
您必须修改ControlTemplate
中项目包装器的ItemContainerStyle
。如果您将其设置为简单ContentPresenter
,那么这些项目将不会包含在任何内容中(DataTemplate
的内容将直接粘贴到DynamicCanvas
中)。
请参阅this article。