无法在绑定的itemscontrols之间拖放项目

时间:2012-03-10 13:07:59

标签: wpf drag-and-drop itemscontrol

iv'e得到了几个绑定项目控件,它们都起到了放置目标的作用 我需要能够在这些项目控件之间拖放项目。

问题在于拖放框架

不会将项目控件识别为放置目标

ItemsControl面板:

    <ItemsPanelTemplate x:Key="TopPipePanelTemplate">
            <StackPanel></StackPanel>
    </ItemsPanelTemplate>

DataTemplate:

    <DataTemplate x:Key="PipeDataItem" >
        <Ellipse Width="45" Height="45" Fill="{Binding IsMine,Converter={StaticResource MyCheckerOwnerToColorConverter}}"></Ellipse>
    </DataTemplate>

ItemsControl样式:

    <Style TargetType="{x:Type ItemsControl}" x:Key="ItemsControlStyle">
          <Setter Property="ItemTemplate" Value="{StaticResource PipeDataItem}"></Setter>
          <Setter Property="AllowDrop" Value="True"></Setter>                                      
          <EventSetter Event="Drop" Handler="ItemsControlDropTarget"></EventSetter> 
          <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ItemsControl_MouseLeftButtonDown"></EventSetter>      
    </Style>

**对于这个例子,我们可以选择2个The ItemsControls:**

    <ItemsControl ItemsSource="{Binding Path=Pipes[23].Checkers}" Style="{StaticResource ItemsControlStyle}"/>
    <ItemsControl Grid.Column="1" ItemsSource="{Binding Path=Pipes[22].Checkers}" Style="{StaticResource ItemsControlStyle}"/>

定期显示:

enter image description here

尽管将AllowDrop设置为True,但空(左)一个不被识别为放置目标 处理Drop事件(与此屏幕中的所有itemscontrols一样,查看上面的ItemsControl Style)

现在当我为itemscontrol面板上色时,它突然被识别出来了:

    <ItemsPanelTemplate x:Key="TopPipePanelTemplate">
            <StackPanel Background="AliceBlue"></StackPanel>
    </ItemsPanelTemplate>

enter image description here

好像现在它占据了它所占据的整个细胞。 我试过将面板设置为VerticalAlignment =“Stretch”,但这也没有影响

我试图理解为什么我的itemcontrols不被识别为启用了drop, 即使我希望他们占用那个空间,另外这些项目用椭圆控制 只有在占据其内容的椭圆的高度才会被识别。

任何想法?

只是为了澄清我的意思被识别为放下目标是当你拖动椭圆时你能够 将它放在itemscontrol之上。

现在我只是将背景设置为透明

1 个答案:

答案 0 :(得分:3)

面板的默认背景颜色不存在,这意味着命中测试会通过它。要让它注册命中测试,例如鼠标悬停事件,您需要为其指定背景颜色。通常我只使用White,虽然你说Transparent也有用,但也是更好的选择。

此外,StackPanels通常只会占用他们需要的空间。您可能最好使用延伸填充所有可用空间的Panel,例如DockPanel LastChildFill="False",并在您的商品上设置DockPanel.Dock="Top"