Wpf ItemsControl和控件附加属性
我试图在WPF中实现一个带有可移动/可调整大小的部分的图。 我想使用ItemsControl,将ItemsPanel配置为“DynamicCanvas”。 关于DynamicCanvas,您现在需要知道的是,它的行为就像一个普通的画布——只有一个例外——它利用附加的属性来存储关于其子对象上X、Y属性的信息 我的代码:Wpf ItemsControl和控件附加属性,wpf,itemscontrol,Wpf,Itemscontrol,我试图在WPF中实现一个带有可移动/可调整大小的部分的图。 我想使用ItemsControl,将ItemsPanel配置为“DynamicCanvas”。 关于DynamicCanvas,您现在需要知道的是,它的行为就像一个普通的画布——只有一个例外——它利用附加的属性来存储关于其子对象上X、Y属性的信息 我的代码: <ItemsControl IsTabStop="False" ItemsSource="{Binding ElementName=comboBox1,Path=Select
<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上显示的控件属于我的自定义类型(以下仅是最重要的部分):
现在问题和问题是:
这里不起作用的部分是附加属性c:DynamicCanvas.Left(顶部)。
让我们把它分为几个步骤:
1) DynamicCanvas希望其直接子级定义c:DynamicCanvas.Left和c:DynamicCanvas.Top
2) ItemsPanel将TableControls放入DynamicCanvas时,会将它们包装在某种容器中
3) DynamicCanvas在其直接子级上看不到附加属性=>将它们视为位于(0,0)处,并使它们实际上不可移动
如何解决此问题?您必须在
ItemContainerStyle
中修改项目包装的ControlTemplate
。如果将其设置为simpleContentPresenter
,则项目将不会被任何内容包装(将DataTemplate
的内容直接粘贴到DynamicCanvas
中)
请参阅。这有帮助吗
<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>
解决方案大不相同,但方向是正确的,谢谢。我不得不把
放在ItemContainerStyle中。我不知道为什么,但我还没有看到你的答案。我自己也发现了这一点,甚至在下面写了一条评论。不过,谢谢你。
<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>