【问题标题】:Receiving event Button in a Grid event from outside从外部接收 Grid 事件中的事件按钮
【发布时间】:2017-12-01 10:38:20
【问题描述】:

我创建了一个自定义控件。 它由一个放置 Button 的 Grid 组成:

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”。

我想我必须从自定义控件中引发一个事件。 我尝试了一些方法,但都没有成功。

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

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    在您的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
    }
    

    【讨论】:

    • 谢谢。我收到错误“clsButton.ButtonClicked:事件属性需要添加和删除访问器”。您的意思是“public EventHandler ButtonClicked { get; set; }”吗?
    • 我设法改进了它。 :-) 在类中:public EventHandler ButtonClicked; _button.Clicked += async (sender, e) => { ButtonClicked?.Invoke(sender, e); };外部:_button.ButtonClicked += async (sender, e) => { // 在这里响应 Debug.Assert(false); };您能相应地更改您的回复吗?
    • 我认为您需要删除“{ get; set; }”。至少对我来说它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    相关资源
    最近更新 更多