未在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事件或类似事件的形式向视觉树中的某些祖先寻求帮助吗?我再次尝试在程序集移动时没有通知项移动时收到通知。
答案 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。