外部ListView.ItemClick事件发生在内部Grid.Tapped但不是内部Button.Tapped之前

时间:2014-11-18 00:47:05

标签: c# xaml windows-runtime windows-store-apps windows-phone-8.1

鉴于以下XAML:

<ListView IsItemClickEnabled="True" ItemClick="ListView_ItemClick">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Button Tapped="Button_Tapped" />
        </DataTemplate>
    </ListView.ItemTemplate>

    <x:String>hello</x:String>
    <x:String>world</x:String>
</ListView>

如果单击某个按钮,则会执行Button_Tapped处理程序,然后根本不执行ListView_ItemClick(无论e.Handled是否在{{1}中设置为true处理程序)。如果我没有单击按钮,但我在列表视图项中单击,则将执行Button_Tapped。这种行为没问题。

但是如果替换网格的按钮是这样的:

ListView_ItemClick

然后点击网格,<ListView IsItemClickEnabled="True" ItemClick="ListView_ItemClick"> <ListView.ItemTemplate> <DataTemplate> <Grid Width="50" Height="50" Margin="10" Background="Red" IsTapEnabled="True" Tapped="Grid_Tapped" /> </DataTemplate> </ListView.ItemTemplate> <x:String>hello</x:String> <x:String>world</x:String> </ListView> 将首先执行,然后ListView_ItemClick。为什么会这样?如何使用按钮以正确的顺序触发事件?如第一个示例中的按钮?

1 个答案:

答案 0 :(得分:1)

该按钮处理指针事件以触发其自己的Click事件,因此ListView永远不会让它们触发其事件。

在几乎所有情况下,我建议使用按钮并处理Click而不是处理Tapped。这对于可访问性更好,因为Button内置了对键盘焦点和单击语义的支持。模板按钮适合您的UI要比实现自己的焦点处理和InvokePattern要容易得多。