【问题标题】:How can I call a method in a base Frame Renderer from the iOS Custom renderer?如何从 iOS 自定义渲染器调用基本帧渲染器中的方法?
【发布时间】:2017-07-06 23:51:57
【问题描述】:

我有这个代码:

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 函数。

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    在您的 CustomRenderer 中,Element 属性基本上是您在 PCL Xamarin Forms 类中声明的视图 PhrasesFrameRenderer

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

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

    var frame = Element as PhrasesFrameRenderer;
    
    if(frame != null)
        frame.abc();
    

    这应该可行。

    注意事项:我不会将自定义视图称为渲染器,因为这会与其实际渲染器产生混淆。您的自定义框架可以命名为PhrasesFrame

    【讨论】:

    • 那么您是建议将 PhrasesFrameRenderer 重命名为 PhrasesFrame 吗? PhrasesFrameCustomRenderer 怎么样,你觉得命名为 PhrasesFrameRenderer 会更好吗?
    • 是的,对于视图PhrasesFrame,如我之前所说,附加单词“渲染器”可能会造成混淆,因为这不是渲染器,而只是视图。在PhrasesFrameCustomRenderer 的情况下,只需调用它PhrasesFrameRenderer 就可以了,至少这是最常用的约定。
    【解决方案2】:

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

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

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

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

    编辑消息中心示例:

    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();
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2017-06-09
      • 2019-11-02
      • 1970-01-01
      • 2020-01-24
      • 2020-10-28
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多