Silverlight 4事件触发器已处理

Silverlight 4事件触发器已处理,silverlight,event-handling,eventtrigger,Silverlight,Event Handling,Eventtrigger,我的应用程序中有两个嵌套的网格(FrameworkElement)项 <UserControl xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"> <Grid x:name="OuterGrid"> <i:Interaction.Triggers> <i:EventTrigger EventName="Mouse

我的应用程序中有两个嵌套的网格(FrameworkElement)项

<UserControl xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">        
<Grid x:name="OuterGrid">
          <i:Interaction.Triggers>
          <i:EventTrigger EventName="MouseLeftButtonDown">
           <i:InvokeCommandAction x:Name="TheOuterCommand" Command="{Binding OuterCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
            <Grid x:name="InnerGrid">
             <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonDown">
                    <i:InvokeCommandAction x:Name="TheInnerCommand" Command="{Binding InnerCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
        </Grid>
    </Grid>
</UserControl>
目前,InnerGrid上的EventTrigger也会触发OuterGrid上的事件,因为在InnerGrid级别未处理MouseLeftButtonEvent

是否有一种方法可以通知事件触发器它已被处理且不应冒泡到OuterGrid

目前,我所能做的就是在InnerGrid周围有一个wrapper FrameworkElement,它使用XAML代码中的一个事件来设置要处理的事件。有人有其他想法吗

----编辑---
最后,我在应用程序中加入了MVVM Light,并用RelayCommand替换了InvokeCommandAction。这正是我想要的。我会将Bryant的回答标记为给我建议的获胜者。

您最好的选择是将事件参数传递给命令,然后标记使用事件参数处理的事件。您可以通过以下方式完成此操作

最好将事件参数传递给命令,然后使用事件参数标记已处理的事件。您可以通过以下方式完成此操作

我们通过添加名为
IsInner
的依赖属性扩展了
EventTrigger
,然后我们总是在内部
EventTrigger
中设置一个静态标志。外部
EventTrigger
取消设置标志,并在设置标志时返回。这非常容易编写,而且运行良好。

我们通过添加名为
IsInner
的依赖属性扩展了
EventTrigger
,然后我们总是在内部
EventTrigger
中设置一个静态标志。外部
EventTrigger
取消设置标志,并在设置标志时返回。这非常容易写,效果也很好。

谢谢你,布莱恩特。如何在viewmodel中定义该命令?MyCommand=newdelegateCommand(???,()=>true)。然后如何访问这些事件参数?我只使用MVVM Light和Caliburn Micro来执行命令,所以我不是100%确定。在MVVM环境下,您可以指定一个RelayCommand作为命令类型,然后该方法将EventArgs作为参数。谢谢,Bryant。如何在viewmodel中定义该命令?MyCommand=newdelegateCommand(???,()=>true)。然后如何访问这些事件参数?我只使用MVVM Light和Caliburn Micro来执行命令,所以我不是100%确定。在MVVM环境中,您可以指定一个RelayCommand作为命令类型,然后该方法将EventArgs作为参数。
OuterCommand = new DelegateCommand(OuterCommandMethod, e => true);
InnerCommand = new DelegateCommand(InnerCommandMethod, e => true);