如何使用 c# 将 TapGestureRecognizer 添加到从 JSON 创建的项目中?

Posted

技术标签:

【中文标题】如何使用 c# 将 TapGestureRecognizer 添加到从 JSON 创建的项目中?【英文标题】:How to add a TapGestureRecognizer with c# to created items from JSON? 【发布时间】:2019-10-16 18:55:29 【问题描述】:

所以我试图反序列化一个 JSON 文件并从中创建一些项目,到目前为止一切正常。我的问题是我想为每个创建的项目添加一个 TapGestureRecognizer,但我不知道该怎么做。


    List<Categories> categorie = JsonConvert.DeserializeObject<List<Categories>>(categoriejson);

 Device.BeginInvokeOnMainThread(() =>
    
  foreach (Categories c in categorie)
    
       Image image = new Image
      
       Source = ImageSource.FromUri(new Uri(c.imageUrl))
      ;

   image.HeightRequest = 105;
   CategorieLayout.Children.Add(image);

所以我只想为每个创建的图像添加一个点击手势。我正在考虑检查默认为每个图像提供的 x:name,但我没有这样做......任何想法都将不胜感激。

【问题讨论】:

当图像被点击时你想做什么? 我将反序列化另一个 json 文件 【参考方案1】:

这样的东西应该可以工作 - 我是凭记忆做的,所以语法可能不完美

Image image = new Image

  Source = ImageSource.FromUri(new Uri(c.imageUrl))
;

var tap = new TappedGestureRecognizer();
tap.Tapped += TappedHandler;
image.GestureRecognizers.Add(tap);

【讨论】:

好的,太好了!但是当点击图片时我应该把我的动作放在哪里? TappedHandler【参考方案2】:

如果你想反序列化一个 JSON 文件并从中创建一些项目,我建议你使用ScrollView 来包装内容。很可能一页不会完全显示,需要滚动。你可以这样做:

 public TestPage1()
 
       StackLayout stackLayout = new StackLayout;

        ScrollView scroll = new ScrollView();
        scroll.Content = stackLayout;

        foreach (Categories c in categorie) 
            var image = new Image
            
                Source = ImageSource.FromUri(new Uri(c.imageUrl))

                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.CenterAndExpand,
            ;
            var tapGestureRecognizer = new TapGestureRecognizer();
            tapGestureRecognizer.Tapped += Image_OnTapped;
            image.ClassId = c.imageUrl;//attach data to image's `ClassId`
            image.GestureRecognizers.Add(tapGestureRecognizer);


            stackLayout.Children.Add(image);
        

        Content = scroll;
 

方法Image_OnTapped

 private void Image_OnTapped(object sender, EventArgs e)
    

      // retrieve parameter from sender's ClassId
        var parm = ((Image)sender).ClassId;


    

注意:

Tapped 事件的发送者将是手势识别器附加到的控件。在你的情况下,一个图像。您可以将数据附加到 Image 的属性之一,以便从事件处理程序中访问它。

 image.ClassId = c.imageUrl;//attach data to image's `ClassId`

并像这样从方法Image_OnTapped 中获取值:

var parm = ((Image)sender).ClassId;

【讨论】:

是否可以知道点击了哪张图片?这样我就可以将每个人与不同的动作联系起来?在 XAML 中我曾经使用 x:name

以上是关于如何使用 c# 将 TapGestureRecognizer 添加到从 JSON 创建的项目中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 将 XSLT 更改为使用动态 XPath?

如何使用 C# 将图像保存在数据库中 [关闭]

如何使用 C# 将 JSON 对象解析为类

如何使用 c# 以编程方式将证书安装到本地机器存储中?

如何将两个整数参数传入并使用 C# 命令行程序? [复制]

如何使用 json.net 将 c# 通用列表转换为 json?