C# 在堆栈子对象上添加单击手势识别器(滚动中的项目)

C# 在堆栈子对象上添加单击手势识别器(滚动中的项目),c#,xamarin,C#,Xamarin,我在gridview中有一个堆栈布局,我使用它作为一种列表。 列表中的“项目”必须是可点击的,但我找不到一种方法使子区域可点击,同时也给事件一个值,以了解用户点击了什么项目 现在我在for循环中创建了20个项。“i”是用于计数的整数。 我在项目的原始BoxView和标签上放置了一个BoxView,它是透明的,并且可以获得手势识别器 var clickableBoxv = new BoxView { BackgroundColor = Color.Transparent, Marg

我在gridview中有一个堆栈布局,我使用它作为一种列表。 列表中的“项目”必须是可点击的,但我找不到一种方法使子区域可点击,同时也给事件一个值,以了解用户点击了什么项目

现在我在for循环中创建了20个项。“i”是用于计数的整数。 我在项目的原始BoxView和标签上放置了一个BoxView,它是透明的,并且可以获得手势识别器

var clickableBoxv = new BoxView
{
    BackgroundColor = Color.Transparent,
    Margin = new Thickness(0, 5, 0, 5)
};

clickableBoxv.GestureRecognizers.Add(new TapGestureRecognizer
{
    Command = new Command(() => Item_Clicked(i)),
});

private void Item_Clicked(int num)
{
    DisplayAlert("Alert", num.ToString(), "OK");
}

但当我单击该项目时,它会显示一个警报,其中只包含最后添加的编号。(我并不感到惊讶)。但是,我怎样才能得到警报来显示具体的项目编号呢?

虽然我还没有测试您的确切代码,但我在for循环中通过一些操作复制了相同的行为

选项1-跟踪方框。

这可能不是最理想的解决方案,但一个选择是跟踪您的框,并使用它们在集合中的索引来表示数字

// 1. A place to store the boxes.
IList<BoxView> boxes = new List<BoxView>();

var clickableBoxv = new BoxView
{
    BackgroundColor = Color.Transparent,
    Margin = new Thickness(0, 5, 0, 5)
};

// 2. Keep track of your clickable boxes.
boxes.Add(clickableBoxv);

clickableBoxv.GestureRecognizers.Add(new TapGestureRecognizer
{
    // 3. Pass in the box rather than the int.
    Command = new Command(() => Item_Clicked(clickableBoxv)),
});

private void Item_Clicked(BoxView box)
{
    // 4. Use the index as the number.
    DisplayAlert("Alert", boxes.IndexOf(box).ToString(), "OK");
}

尝试设置上一个BoxView的背景色,您可能会看到它正在填充所有可用空间。请在没有BoxView上的透明面板的情况下尝试。可能是因为BoxView是透明的,所以它不接受单击事件。@Bijington它完美地填充了右侧spaces@micaelcunha它确实响应事件,只是它只给处理程序最后一个附加值,这是合乎逻辑的,但我不希望发生这种情况。但是我不知道如何给它指定特定项的特定值。出于兴趣,为什么不使用
列表视图
?我尝试了第二个选项,因为我已经有了自定义的BoxView(问题中的代码中没有显示),所以我添加了索引部分。首先,我得到了一个0,但我在
var clickable=new MyBoxView
中的索引中添加了“I”(for循环使用的计数器),现在它正是我想要的。谢谢(:我在任何地方都找不到解决方案,我自己也找不到(在您的评论后也尝试了bindingcontent)。再次感谢大家!!好消息!我已经更新了我的示例,以包含缺少的索引分配
// 1. Sub class
public class MyBoxView : BoxView
{
    public int Index { get; set; }
}

// 2. Use new sub class
var clickableBoxv = new MyBoxView
{
    BackgroundColor = Color.Transparent,
    Margin = new Thickness(0, 5, 0, 5),
    Index = i,
};

clickableBoxv.GestureRecognizers.Add(new TapGestureRecognizer
{
    // 3. Pass in the box rather than the int.
    Command = new Command(() => Item_Clicked(clickableBoxv)),
});

private void Item_Clicked(MyBoxView box)
{
    // 4. Use the index as the number.
    DisplayAlert("Alert", box.Index.ToString(), "OK");
}