![](/img/trans.png)
[英]ListView.ItemClick not fired in ListView with custom ItemContainerStyle
[英]Outer ListView.ItemClick event happening before inner Grid.Tapped but not inner Button.Tapped
鑒於以下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
執行Button_Tapped
處理程序,然后根本不會執行ListView_ItemClick
(無論Button_Tapped
處理程序中e.Handled
是否設置為true)。 如果我沒有單擊按鈕,而是在列表視圖項中單擊,則將執行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
,然后執行Grid_Tapped
。 為什么會這樣呢? 如何像第一個示例中一樣,以正確的順序觸發事件?
該按鈕處理指針事件以觸發其自己的Click事件,因此ListView永遠不會使它們觸發其事件。
在幾乎所有情況下,我建議您使用Button並處理Click而不是處理Tapped。 由於Button具有對鍵盤焦點和單擊語義的內置支持,因此這對可訪問性更好。 模板化Button以適合您的UI比實現您自己的焦點處理和InvokePattern要容易得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.