我在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");
}
但是当我点击该项目时,它会显示一个仅包含最后添加的号码的警报。 (这并没有让我感到惊讶)。但是,如何获取警报以显示具体的项目编号?
答案 0 :(得分:1)
虽然我没有测试你的确切代码,但我在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");
}
选项2 - 子类BoxView
// 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");
}