拖动行为不适用于ItemsControl:MouseDragElementBehavior中的项目

时间:2014-07-17 15:32:25

标签: wpf drag itemscontrol

我有一个班级

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结构:

First case

第二种情况是以下XAML结构:

Second case

更新

我发现在第二种情况下使用ItemsControl一个DrawingCanvas.Parent = null

1 个答案:

答案 0 :(得分:0)

与该item.Parent内的ItemsControls中的父项一直是空的

我已经在以下主题中找到了解决方案的解决方案:

Why does the Parent property of a container of an ItemsControl return null and not the Panel it sits on?

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>