这是我在XAML中的布局:
<ScrollViewer Name="svDesigner" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Focusable="False">
<ItemsControl ItemsSource="{Binding DesignerRowsCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type base:UI_DesignerRow}">
<cntrl:BabDesignerRow Margin="2"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<dxmvvm:Interaction.Behaviors>
<dxmvvm:EventToCommand EventName="MouseLeftButtonDown"
Command="{Binding SetPropertiesSourceCommand}" PassEventArgsToCommand="True">
<dxmvvm:EventToCommand.EventArgsConverter>
<conv:DesignerItemClickEventArgsConverter/>
</dxmvvm:EventToCommand.EventArgsConverter>
</dxmvvm:EventToCommand>
</dxmvvm:Interaction.Behaviors>
</ItemsControl>
在后面的代码中我有这个Sub来处理ScrollViewer的PreviewMouseLeftButtonDown事件:
Private Sub DesignerItemSelectionRedirect(sender As Object, e As MouseButtonEventArgs) Handles svDesigner.PreviewMouseLeftButtonDown
在我的UserControl BabDesignerRow中,我有很多不同的UI对象,如TextBox,ComboBox,LayoutGroup等。
现在,无论我在哪里点击,我总是将整个ItemsControl作为e.Source而不是所选的真实对象。
有没有办法在UserControl中点击对象?
我需要获取此信息以突出显示用户选择的内容。
答案 0 :(得分:1)
这是因为路由事件的隧道策略。您应该阅读有关路由事件及其冒泡和隧道策略的更多信息。
您可以使用此事件的冒泡版本:e.OriginalSource
。作为MSDN states:
虽然这似乎遵循通过元素的冒泡路线 树,它实际上是一个直接路由事件,被提出并重新加注 每个UIElement沿着元素树。
所以这不是一个真正冒泡的事件,但它应该适合你的情况。
或者,您可以使用e.Source
属性而不是lstOrdered
来获取导致此事件的元素。