从外部接收Grid事件中的事件按钮

时间:2017-12-01 01:09:30

标签: xamarin xamarin.forms

我创建了一个自定义控件。 它由一个放置按钮的网格组成:

using Xamarin.Forms;

namespace MyApp
{
    public class clsButton : ContentView
    {
        private Grid _grid;
        private Button _button;

        public clsButton()
        {
            _grid = new Grid
            {
                Margin = new Thickness(0),
                VerticalOptions = LayoutOptions.FillAndExpand,
                HorizontalOptions = LayoutOptions.FillAndExpand,
            };
            _grid.BindingContext = this; 

            _button = new Button()
            {
            };
            _button.Clicked += async (sender, e) =>
            {
                //I tried different things here, but none gave me the right results. I need to "bubble" this click to the outside
                return;
            };

            _grid.Children.Add(_button, 0, 0);

            this.Content = _grid;
        }
    }
}

我在ContentPage中创建了一些这样的自定义控件,如下所示:

_MyButton = new clsImageButton()
{
};
var nTapGestureRecognizer = new TapGestureRecognizer();
nTapGestureRecognizer.Tapped += OnButtonClicked;
_MyButton.GestureRecognizers.Add(nTapGestureRecognizer);

这是同一个ContentPage中的空白:

async void OnButtonClicked(object sender,EventArgs e)
{
     //I don't managed to get here
}

这不起作用。 永远不会调用“OnButtonClicked”。

我想我必须在自定义控件中引发一个事件。 我试了一些东西,但没有一个成功。

我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:3)

在您的clsButton中,宣布公开活动

public EventHandler ButtonClicked { get; set; }

然后在点击按钮时提升事件

       _button.Clicked += async (sender, e) =>
        {
          if (ButtonClicked != null) ButtonClicked(this,e);
        };

最后,无论您使用clsButton,您都可以订阅该事件(不需要手势识别器)

var btn = new clsButton();
btn.ButtonClicked += async (sender, e) => {
  // respond here
}