0

我的应用程序中有两个嵌套的 Grid (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>

每个 InvokeCommand 都附加到视图模型中的DelegateCommand(来自 Prism 库)。

OuterCommand = new DelegateCommand(OuterCommandMethod, e => true);
InnerCommand = new DelegateCommand(InnerCommandMethod, e => true);

目前,由于未在InnerGrid级别处理MouseLeftButtonEvent , InnerGrid上的 EventTrigger也会触发OuterGrid上的事件。

有没有办法可以通知EventTrigger它已被处理并且它不应该冒泡到 OuterGrid?

目前,我能想到的就是在 InnerGrid 周围有一个包装器 FrameworkElement,它使用 XAML 代码隐藏上的事件来设置要处理的事件。有没有人有任何其他想法?

---- 编辑 ---- 最后,我在我的应用程序中包含了 MVVM Light,并用 RelayCommand 替换了 InvokeCommandAction。这现在按我的预期工作。我会把科比的回答标记为给我建议的赢家。

4

2 回答 2

3

我们EventTrigger通过添加调用的依赖属性进行了扩展IsInner,然后我们总是在内部设置一个静态标志EventTrigger。外部EventTrigger取消设置标志,如果设置了标志则返回。这非常容易编写并且效果很好。

于 2012-11-28T17:09:11.050 回答
0

您最好的选择是将事件参数传递给命令,然后使用事件参数标记已处理的事件。您可以按照此处的示例执行此操作。

于 2011-09-22T00:19:51.143 回答