SL4:需要在ItemsControl中的Item上注册移动(或重绘)事件

时间:2011-09-18 02:10:40

标签: silverlight events silverlight-4.0 behavior attachedbehaviors

未在FrameworkElement类中找到move事件或重绘事件。谷歌也没有帮助。所以......

我有一个自定义ItemsControl,由VM中的可观察集合填充。 ItemsControl本身利用

<i:Interaction.Behaviors>
    <ei:MouseDragElementBehavior ConstrainToParentBounds="True"/>
</i:Interaction.Behaviors>

行为,因此用户可以拖动整个程序集。

当用户移动装配体时,我希望每个得到通知,因为装配体移动会重新定位。到目前为止,我已经尝试注册

this.myItem.LayoutUpdated += this.OnSomethingNeedsToUpdate;

但是当我拖动组件时似乎没有发射。

另外

this.myItem.MouseMove += this.OnSomethingNeedsToUpdate;

只有当我鼠标进入不够好的项目时才有效。因为我正在移动ItemsControl,然后必须将鼠标移动到项目中才能触发事件。

有什么想法吗?我可以通过OneOfMyDecendantsWasRedrawn事件或类似事件的形式向视觉树中的某些祖先寻求帮助吗?我再次尝试在程序集移动时没有通知移动时收到通知。

2 个答案:

答案 0 :(得分:0)

我想说最好的办法是将MouseDragElementBehavior添加到代码中的自定义ItemsControl而不是Xaml中。这可能是这样的(使用网格,因为这更容易演示):

public class DraggableGrid : Grid
{

    public DraggableGrid()
    {
        Loaded += new RoutedEventHandler(DraggableGrid_Loaded);
    }

    void DraggableGrid_Loaded(object sender, RoutedEventArgs e)
    {
        MouseDragElementBehavior dragable = new MouseDragElementBehavior();
        Interaction.GetBehaviors(this).Add(dragable);
        dragable.Dragging += new MouseEventHandler(dragable_Dragging);
    }    

    void dragable_Dragging(object sender, MouseEventArgs e)
    {
        // Custom Code Here
    }
}

在自定义代码在此处的部分中,您将循环浏览项目并通知他们正在拖动它们。

答案 1 :(得分:0)

我最后为我关心的各个项目编写了另一个行为,然后编写了一个LINQ查询来搜索可视树,查找附加了MouseDragElementBehavior的祖先。该查询找到了ItemsControl,因为它是Item的最终父级。然后我就可以注册拖拽事件了。

再次感谢Bryant提供解决方案over here