Xamarin在自定义渲染器上形成事件冒泡和调用操作

时间:2015-08-09 17:37:02

标签: c# xamarin icommand eventhandler xamarin-forms

我正在创建一个自定义Xamarin Forms控件,它在视图中包含三个按钮(1,2,3)。为了这个例子,我们只是称它为GaugeView。以下是目前的设置方式:

  • GuageView在iOS和Android上都有一个名为GuageViewRenderer的自定义渲染器。
  • GuageView公开Clicked1Clicked2Clicked3的事件处理程序。
  • GuageView公开了ICommandClick1Click2的{​​{1}}个属性。

问题是,我需要从自定义渲染器触发事件​​处理程序,因为只有本机平台控件知道何时按下了其中一个按钮。如何将事件重新发送回Click3,这是共享代码所在的位置?

我计划将命令和事件处理程序连接到自定义渲染器中,但是因为事件只能从原始类中触发({{1 }})。

有没有更好的方法来构建它?我要做的主要事情是暴露平台本机guage并连接其按钮,以便共享代码(GuageView)中的事件处理程序获取事件发生。

2 个答案:

答案 0 :(得分:3)

是的,你不能在声明它们的类之外引发事件。因此,您必须向GaugeView添加一个可以引发事件的方法。我也会使用相同的方法调用命令。所以在GaugeView

public void RaiseClick1() {
    var clicked1 = Clicked1;
    if (clicked1 != null)
        clicked1(this, EventArgs.Empty);

    if (Command1 != null && Command1.CanExecute(Command1Paramter))
         Command1.Execute(Command1Parameter);
}

然后在GaugeViewRender中,只要您需要通知视图单击按钮:

Element.RaiseClick1();

答案 1 :(得分:-1)

迟到的答案,但可能是将来:您可以使用IButtonController界面从外部提升按钮的click事件。

Xamarin.Forms.Button类实现了这个接口,它提供了一个方法:SendClicked

通过将渲染器(this.Element)中的Xamarin.Forms元素强制转换为IButtonController,您可以调用此方法并引发Xamarin.Forms.Button的单击事件。

我还创建了一篇关于此主题的博文:http://software.fauland.cc/?p=5637