我有包含多个项目的 CollectionView。
这些项目具有相同的数据模板,其中包含带有按钮的堆栈布局。
<CollectionView ItemSizingStrategy="MeasureFirstItem"
ItemsSource="{Binding SaveItems}"
SelectionMode="None">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="listItems:MyItemVM">
<StackLayout TouchEffect.Command="{Binding SelectedItemCommand}"
TouchEffect.CommandParameter="{Binding .}">
<Button Command={Binding OnCreateCommand} CommandParameter={Binding .} />
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
当我按下按钮时,将调用 Stacklayout,因为它的视图层次结构较高。我该如何做到这一点,以便我按下按钮外部它会调用 StackLayout 命令,并且如果我按下按钮则会调用按钮命令?
我尝试了InputTransparent、CascadeInputTransparent、TouchEffect.ShouldMakeChildrenInputTransparent的多种设置。我原以为 InputTransparent = true 会导致两个命令都有效,但没有。当 InputTransparent = true 时,一个有效,另一个无效,反之亦然。
我曾考虑过使用 Skia 渲染器来检测触摸位置,或者在本机代码中拦截触摸事件,但我希望 XAML 有更简单的方法。
编辑:我设法使用以下数据模板检测这两个命令:
<StackLayout>
<Grid>
<Grid TouchEffect.Command="{Binding SelectedItemCommand}"
TouchEffect.CommandParameter="{Binding .}" />
<Grid>
<Button Command={Binding OnCreateCommand} CommandParameter={Binding .} />
</Gri>
</Grid>
</StackLayout>
因为网格内容可以叠加。它的性能不是很好,但它可以工作。
已解决:我设法使用以下数据模板检测这两个命令:
<StackLayout>
<Grid>
<Grid TouchEffect.Command="{Binding SelectedItemCommand}"
TouchEffect.CommandParameter="{Binding .}" />
<Grid>
<Button Command={Binding OnCreateCommand} CommandParameter={Binding .} />
</Gri>
</Grid>
</StackLayout>
因为网格内容可以叠加。它的性能不是很好,但它可以工作。