如何从iOS自定义渲染器中调用基本帧渲染器中的方法?

时间:2017-07-06 15:31:57

标签: xamarin xamarin.forms

我有这段代码:

public partial class PhrasesFrameRenderer : Frame
{
    Random rand = new Random();
    private int answeredPhraseCount;
    private int correctAns;

    public PhrasesFrameRenderer()
    {
        InitializeComponent();
        App.PhrasesFrameRenderer = this;

        public void abc()
        {

            ....
        };

和自定义渲染器

[assembly: ExportRenderer(typeof(PhrasesFrameRenderer), typeof(PhrasesFrameCustomRenderer))]
namespace Japanese.iOS
{
    public class PhrasesFrameCustomRenderer : FrameRenderer
    {
        UISwipeGestureRecognizer leftSwipeGestureRecognizer;
        UISwipeGestureRecognizer rightSwipeGestureRecognizer;
        PhrasesFrameRenderer frame;
        bool rightSwipeEnabled = false;

有人可以向我解释如何从自定义渲染器代码中调用Phrases FrameRenderer中的ABC函数。

2 个答案:

答案 0 :(得分:8)

在您的CustomRenderer中,angular.module('frontProfilDeveloppementApp') .controller('AboutCtrl', function ($scope, $http, $sce){ var url = $sce.trustAsResourceUrl('http://localhost:8000/index'); $http.get(url}) .then(function (data) { $scope.result = data; }); }); 属性基本上是您在PCL Xamarin Forms类中声明的视图Element

您只需要将此属性强制转换为类,您就可以访问所有公共方法和属性。

PhrasesFrameRenderer

var frame = (PhrasesFrameRenderer)Element;
frame.abc();

这应该有用。

一个注释:我不会将自定义视图称为渲染器,因为这可能会与其实际渲染器产生混淆。您的自定义框架可以命名为var frame = Element as PhrasesFrameRenderer; if(frame != null) frame.abc();

答案 1 :(得分:1)

因此'ExportRenderer'标志基本上告诉本机项目,如果它试图显示该类型的控件,则在必要时覆盖本机代码中使用的任何内容(I.E.您的类'PhrasesFrameCustomRenderer'中的覆盖方法)。

这意味着您的自定义渲染器在技术上不是从您的自定义框架派生的,它来自一个特殊的xamarin表单类,在本例中是一个名为“FrameRenderer”的类。因此,它无法访问表单项目('PhrasesFrameRenderer')中派生控件中的任何方法。

因此,您的答案的解决方案完全取决于您要实现的目标。

如果您只是想在某个时间调用该方法,那么您可以考虑订阅messagingcenter,如果您想访问该方法可能创建的变量/数据,那么可以通过一般的静态字典来完成用于设置和获取对象。

编辑 MessagingCenter示例:

public partial class PhrasesFrameRenderer : Frame
{
    Random rand = new Random();
    private int answeredPhraseCount;
    private int correctAns;

    public PhrasesFrameRenderer()
    {
        InitializeComponent();
        App.PhrasesFrameRenderer = this;
        MessagingCenter.Subscribe<App>(App, "invokeABC", abc);
    }

    public void abc(App obj)
    {


    };
}

并且在您的自定义渲染器中,无论您想要调用该方法,都需要以下内容:

MessagingCenter.Send((App)Xamarin.Forms.Application.Current, "invokeABC");

这一切都假定您不需要在两个类之间传递任何数据。

编辑静态指针

仔细查看代码,在App类的变量中放置一个指向自定义框架的指针。理论上你可以打电话给

App.PhrasesFrameRenderer.abc();