在堆栈子项上添加单击手势识别器(滚动项目)

时间:2018-04-04 11:49:40

标签: c# xamarin

我在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");
}

但是当我点击该项目时,它会显示一个仅包含最后添加的号码的警报。 (这并没有让我感到惊讶)。但是,如何获取警报以显示具体的项目编号?

1 个答案:

答案 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");
}