我正在尝试在我拥有的控件上处理MouseDragElementBehavior.Dragging事件。有关我为何要这样做的背景,请参阅here。
我无法接通此事件。从XAML中您可以看到我已向用户控件添加了一个行为。然后我尝试通过CallMethodAction EventTrigger为行为添加一个处理程序。
<i:Interaction.Behaviors>
<ei:MouseDragElementBehavior ConstrainToParentBounds="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Dragging">
<ei:CallMethodAction MethodName="NotifyChildrenYouAreDragging" TargetObject="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ei:MouseDragElementBehavior>
</i:Interaction.Behaviors>
我尝试了以下方法签名但没有运气:
void NotifyChildrenYouAreDragging(){}
void NotifyChildrenYouAreDragging(object sender, EventArgs e){}
void NotifyChildrenYouAreDragging(object sender, MouseEventArgs e){}
任何人都有使用触发器处理附加行为中的事件的经验吗?
答案 0 :(得分:4)
问题是EventTrigger没有连接到Behavior的事件。相反,它正在连接到Behavior的AssociatedObject的事件。以下是相关的源代码:
protected override void OnAttached()
{
base.OnAttached();
DependencyObject associatedObject = base.AssociatedObject;
Behavior behavior = associatedObject as Behavior;
FrameworkElement element = associatedObject as FrameworkElement;
this.RegisterSourceChanged();
if (behavior != null)
{
associatedObject = ((IAttachedObject) behavior).AssociatedObject;
behavior.AssociatedObjectChanged += new EventHandler(this.OnBehaviorHostChanged);
}
....
}
因此,您可以看到,如果触发器的关联对象是行为,那么它会将关联对象设置为行为的关联对象,即物品集合。 items集合没有拖动事件,因此不会触发任何内容。
您可以通过创建另一个行为来检查相关对象是否具有拖动行为,如果有,则将行为附加到拖动事件,从而获得所需的结果。然后从那里调用对象上的方法。