将MouseDragElementBehavior与ItemsControl和Canvas一起使用

时间:2011-06-15 13:51:37

标签: wpf wpf-controls attachedbehaviors

使用ItemsControl和Custom Canvas时,我目前在使用Blend SDK中的MouseDragElementsBehavior时遇到问题。我的自定义画布只是根据DependencyProperty添加或删除其子项中的MouseDragElement。当我手动将项目添加到Canvas的子项时,这很好用,但在移动到ItemsControl时似乎已经坏了。

我目前正在使用以下ItemsControl代码:

<ItemsControl ItemsSource="{Binding Path=CanvasItems}">
  <ItemsControl.DataContext>
    <ViewModels:ViewModel/>
  </ItemsControl.DataContext>
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <my:CustomCanvas Background="Black" IsEditable="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CanEdit}" AllowDrop="{Binding RelativeSource={RelativeSource Self}, Path=IsEditable}"  />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
</ItemsControl>

在Canvas.VisualChildrenChanged方法中添加拖动行为不允许像以前一样移动新创建的对象。

我是否需要将Drag行为添加到传递给VisualChildrenChanged或提供特殊样式的ContentPresenter以外的其他内容?

2 个答案:

答案 0 :(得分:0)

我真的不知道混合sdk行为,但我一直在处理行为,所以我希望适用相同的机制。

如果要向ItemsControl创建的控件添加行为,最好的方法是通过ItemsControl.ItemContainerStyle中的setter添加它,尽管在这种情况下我发现将它添加到ItemsControl.ItemTemplate中更容易

这样的东西
        <ItemsControl ItemsSource="{Binding CanvasItems}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas Background="Transparent" AllowDrop="True" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Green" BorderThickness="1" Background="AntiqueWhite">
                        <i:Interaction.Behaviors>
                            <ei:MouseDragElementBehavior ConstrainToParentBounds="True" DragBegun="MouseDragElementBehavior_DragBegun"/>
                        </i:Interaction.Behaviors>
                        <ContentControl Content="{Binding}" />
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

答案 1 :(得分:-1)

<ItemsControl ItemsSource="{Binding CanvasItems}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="YourControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="YourControl">
                        <Border>
                            <Grid>
                                <SystemWindowsInteractivity:Interaction.Behaviors>
                                    <MicrosoftExpressionInteractivityLayout:MouseDragElementBehavior />
                                </SystemWindowsInteractivity:Interaction.Behaviors>
                                <ContentPresenter />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>