我有一个班级
public class DrawingCanvas : FrameworkElement
使用MouseDragElementBehavior实现拖动。
我想将DrawingCanva像Photoshop中的图层一样拖动到另一个图层
单独工作(XAML on pic#1)
<Grid x:Name="_layoutRootControl">
<Canvas
Grid.Column="0">
<canvas:DrawingCanvas />
<canvas:DrawingCanvas />
</Canvas>
</Grid>
允许拖动,但是当我在 ItemsControl 中放置 DrawingCanvas 时 并将 ItemsSource 绑定到项目集合,draggins不起作用。 (图2中的XAML)
<ItemsControl ItemsSource="{Binding Source={StaticResource Locator}, Path=LayersViewModel.Layers}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="0" />
<Setter Property="Canvas.Top" Value="0" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<canvas:DrawingCanvas />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我不明白为什么。
第一种情况是以下XAML结构:
第二种情况是以下XAML结构:
更新
我发现在第二种情况下使用ItemsControl一个DrawingCanvas.Parent = null
答案 0 :(得分:0)
与该item.Parent内的ItemsControls中的父项一直是空的
我已经在以下主题中找到了解决方案的解决方案:
Combining ItemsControl with draggable items - Element.parent always null
<强>更新强>
现在Parent不为null,问题仍然存在。
更新2
最后的缺点 我必须定义&#34; 扩展器:DragHelper.CanDrag &#34;在ContentPresenter中而不是
<ItemsControl.ItemTemplate>
生成的模板如下,因此问题得以解决:
<ItemsControl
ItemsSource="{Binding Source={StaticResource Locator}, Path=LayersViewModel.Layers}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property=**"extenders:DragHelper.CanDrag"** Value="True"/>
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<surfaces:DrawingCanvas />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>