在ListView中为Image添加一个手势识别器(Xamarin.Forms)

10

我正在尝试在ListView中的Image上添加一个轻拍手势。

以下的Image在ListView中没有Image.GestureRecognizers部分时可以正常显示,但是加上时,ListView就不会显示任何内容(也没有错误信息)。为了澄清这一点,ListView中还有一个Label,它也不会被渲染。

<Image x:Name="newsImage" VerticalOptions="End" HeightRequest="200" WidthRequest="200" Aspect="AspectFill" Source="{Binding Imageurllarge}">
                        <Image.GestureRecognizers>
                            <TapGestureRecognizer 
                                Tapped="OnTapGestureRecognizerTapped" 
                                NumberOfTapsRequired="1" />
                        </Image.GestureRecognizers>
                    </Image>

我从这里拿到的 - http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/gestures/(假设此示例不适用于listview图像,但应该可以在listview中使用)。

另外(根据评论建议)

<Image.GestureRecognizers>
    <TapGestureRecognizer 
      Command="{Binding TapCommand}" 
      CommandParameter="newsImage" />

似乎也不会更好。

如果有人有如何在代码后端添加此内容的示例(没有视图模型也可以),那就行了。


请注意,TappedCallback已过时,请使用Command - Sten Petrov
尝试了命令变体,结果相同。 - WickedW
需要点击的是特定的图像吗?ListView 的选择更改事件不起作用吗? - Sten Petrov
我可能可以重新调整一些东西来避免这种情况,但我真的需要吗?我的要求是否超出了寻常,即您永远不应该使用ListView并拥有单独的可点击图像? - WickedW
WickedW,你最终解决了这个问题吗? - Eoin Campbell
@EoinCampbell Campbell,抱歉我很久没有看过这个了,有机会会重新审查下面的答案... - WickedW
3个回答

3

您可以在ListView中使用DataTemplate,在DataTemplate内添加Grid,然后添加UI元素。在给定的示例中,我展示了名称、联系电话和图像,我在图像上使用了GestureRecognizers。请尝试以下操作:

<ListView x:Name="myListView" ItemsSource="{Binding Contacts}" >             
<ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell Height="75">
        <Grid Padding="5">
            <Grid.RowDefinitions>
                <RowDefinition Height="20"></RowDefinition>
                <RowDefinition Height="20"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="30" />
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="80"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Image Source="user_img.png" Grid.Column="0" Grid.RowSpan="2" VerticalOptions="CenterAndExpand"/>
            <Label Grid.Row="0" Grid.Column="1" Font="16" Text="{Binding DisplayName}" LineBreakMode="TailTruncation"></Label>
            <Label Grid.Row="1" Grid.Column="1" Font="12" Text="{Binding Number}"  LineBreakMode="TailTruncation"></Label>

            <Image Grid.Row="0" Grid.RowSpan="3"  Grid.Column="2" Source="add.png" Aspect="AspectFill">
            <Image.GestureRecognizers>
                <TapGestureRecognizer 
                    Command="{Binding AddCommand}" 
                    CommandParameter="{Binding Number}" />
                  </Image.GestureRecognizers>
            </Image>        
        </Grid>
        </ViewCell>
     </DataTemplate>
   </ListView.ItemTemplate>    
</ListView>

1
我在编程中使用TapGestureRecognizer时取得了成功。例如,可以通过在XAML中指定其自己的x:Name属性,然后在代码中添加一个tap处理程序来实现。

示例标记:

<Image.GestureRecognizers>
    <TapGestureRecognizer x:Name="tapImage" NumberOfTapsRequired="1" />
</Image.GestureRecognizers>

然后在代码中,类似于:

this.tapImage.Tapped += async (object sender, EventArgs e) => {
... // Do whatever is wanted here
}

处理程序不一定要标记为 async,但在我的使用中,通常会发生异步操作,例如确认对话框或扫描条形码。

0

您还可以将手势识别器附加到列表视图中的图像上。手势识别器可以绑定到视图模型中的命令。

     <ListView x:Name="ExampleList" SeparatorVisibility="None" VerticalOptions="Start" HeightRequest="{Binding HeightRequest}"
                     HasUnevenRows="True"
                     CachingStrategy="RecycleElement"
                     ItemsSource="{Binding FeedItems}"
                      IsPullToRefreshEnabled="True"
                      RefreshCommand="{Binding LoadItemsCommand}"
                      IsRefreshing="{Binding IsBusy, Mode=OneWay}">
            <ListView.ItemTemplate  >
              <DataTemplate>
                <ViewCell>
                  <StackLayout Orientation="Horizontal">

                    <StackLayout Orientation="Vertical">
                      <Label Text="{Binding TimeAgo}" FontSize="8"></Label>
                      <StackLayout Orientation="Horizontal">
                        <Image Source="Accept.png" HeightRequest="30" WidthRequest="45" IsVisible="{Binding IsAccepted, Converter={StaticResource inverse}}">
                          <Image.GestureRecognizers>
                            <TapGestureRecognizer Command="{Binding Source={StaticResource sampleViewModel}, Path=AcceptCommand}" CommandParameter="{Binding RequestID}" />
                          </Image.GestureRecognizers>
                        </Image>                          
                      </StackLayout>
                    </StackLayout>
                  </StackLayout>
                </ViewCell>
              </DataTemplate>
            </ListView.ItemTemplate>
          </ListView>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接