我正在尝试使用 MVVM 方法在控件上捕获鼠标事件。我正在使用混合事件触发器来调用命令。
在下面的示例中,我有一个统一的网格,并且网格中的每个项目都呈现为一个矩形。我想记录简单的手势(比如当用户画一条线时),所以我想在鼠标按钮按下时执行一个命令,在几个项目上移动然后被抬起。
我将事件触发器放在矩形上,因为我想捕获哪个视图模型项用于开始或结束所谓的手势。
似乎PreviewMouseDown和PreviewMouseUp没有作为 Rectangle 的一部分触发。但是,如果我将这些事件移动到UniformGrid,它们会正确触发,但我没有用于开始/结束手势的项目。
MouseEnter命令按预期触发。
关于为什么 Preview* 事件没有触发的任何想法,或者你能建议不同的标记吗?
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding Rows}" Columns="{Binding Columns}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Fill="Red">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<i:InvokeCommandAction
Command="{Binding Path=DataContext.AddItem, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"
/>
</i:EventTrigger>
<i:EventTrigger EventName="PreviewMouseDown">
<i:InvokeCommandAction
Command="{Binding Path=DataContext.StartGesture, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"
/>
</i:EventTrigger>
<i:EventTrigger EventName="PreviewMouseUp">
<i:InvokeCommandAction
Command="{Binding Path=DataContext.EndGesture, RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}"
/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>`