什么';这是“什么?”;如果(控制==null)";在Xamarin iOS渲染器中用于的节?

什么';这是“什么?”;如果(控制==null)";在Xamarin iOS渲染器中用于的节?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,查看Xamarin的一个示例片段,我看到他们建议创建一个包含三个部分的自定义渲染器: if(Control==null) if(e.OldElement!=null) if(例如NewElement!=null) 我的渲染器看起来像这样。但是,我不明白我将如何使用if(Control==null)部分来进行分析 问题1)有谁能给我一些建议,告诉我如何使用这个工具,以及我的实现是否有问题 问题2)我是否正确实现了这一点,以及如何/在何处删除OnTabbarControllerItemSelecte

查看Xamarin的一个示例片段,我看到他们建议创建一个包含三个部分的自定义渲染器:

  • if(Control==null)

  • if(e.OldElement!=null)

  • if(例如NewElement!=null)

  • 我的渲染器看起来像这样。但是,我不明白我将如何使用
    if(Control==null)
    部分来进行分析

    问题1)有谁能给我一些建议,告诉我如何使用这个工具,以及我的实现是否有问题

    问题2)我是否正确实现了这一点,以及如何/在何处删除
    OnTabbarControllerItemSelected
    处理程序

    问题3)控制元件来自哪里?这是我调用的
    \u page
    变量还是元素
    e

    tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;
    
    public class TabbedPageRenderer : TabbedRenderer
    {
        private MainPage _page;
    
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
    
            //if (Control == null)
            //{
            //    // Instantiate the native control
            //}
    
            if (e.OldElement != null)
            {
                // Unsubscribe from event handlers and cleanup any resources
                e.OldElement.PropertyChanged -= Current_PropertyChanged;
                return;
            }
    
            if (e.NewElement != null)
            {
                // Configure the control and subscribe to event handlers
                TabBar.Translucent = false;
                TabBar.BackgroundImage = new UIImage();
                _page = (MainPage)e.NewElement;
                e.NewElement.PropertyChanged += Current_PropertyChanged;
            }
    
            try
            {
                var tabbarController = (UITabBarController)this.ViewController;
                if (tabbarController != null)
                {
                    tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;
                    UpdateTheme();
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
    
        private void OnTabbarControllerItemSelected(object sender, UITabBarSelectionEventArgs eventArgs)
        {
            if (!(_page.CurrentPage is Japanese.CardsTabPage) && App.quizRunning == true)
                _page.CurrentPage = App.navCardsTabPage;
        }
    
        void Current_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Theme")
                UpdateTheme();
        }
    
        void UpdateTheme()
        {
            switch (_page.Theme)
            {
                default:
                case TH.Light:
                    TabBar.SelectedImageTintColor = UIColor.Red;
                    break;
                case TH.Dark: 
                    TabBar.SelectedImageTintColor = UIColor.Red;
                    break;
            }
        }
    
    }
    
    问题1和3

    该代码段用于编写自定义渲染器,
    控件
    属性在类中。由于控件继承自
    选项卡渲染器
    ,因此无需遵循代码段

    问题2

    属性返回
    选项卡渲染器本身,因此无需每次调用
    OnElementChanged
    时都添加侦听器。考虑把它移到构造函数。< /P> 像这样:

    公共类TabbedPageRenderer:TabbedRenderer
    {
    私人主页(u页),;
    公共选项卡PageRenderer()
    {
    this.ViewControllerSelected+=OnTabbarControllerItemSelected;
    }
    受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
    {
    基础。一个要素发生变化(e);
    if(e.OldElement!=null)
    {
    //取消订阅事件处理程序并清理任何资源
    e、 OldElement.PropertyChanged-=当前_PropertyChanged;
    返回;
    }
    if(例如NewElement!=null)
    {
    //配置控件并订阅事件处理程序
    TabBar.Translucent=false;
    TabBar.BackgroundImage=新UIImage();
    _page=(主页)e.NewElement;
    e、 NewElement.PropertyChanged+=当前_PropertyChanged;
    }
    如果(_page!=null)
    更新名称();
    }
    已选择AbbarControllerItemPrivate void(对象发送方,UIAbbarSelectionEventArgs)
    {
    如果(_page!=null&&!(_page.CurrentPage为Japanese.CardsTabPage)&&App.quizRunning==true)
    _page.CurrentPage=App.navCardsTabPage;
    }
    无效当前属性更改(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
    {
    如果(例如,PropertyName==“主题”)
    更新名称();
    }
    void updatetime()
    {
    开关(_page.Theme)
    {
    违约:
    案例TH.灯:
    TabBar.SelectedImageTintColor=UIColor.Red;
    打破
    案例TH.黑暗:
    TabBar.SelectedImageTintColor=UIColor.Red;
    打破
    }
    }
    }
    
    是不是每次有一个元素发生更改时,当前代码都会不断添加+=OnTabbarControllerItemSelected,并且从不删除它?对不起,我没有注意到,我已经更新了答案。你也可以编辑代码,因为开头还有一行+=行。如果你不介意,你可以复制粘贴我的代码,并将你建议的更正粘贴到答案上,然后我会接受它。如果你的建议出现在答案中,人们会更容易理解。谢谢,谢谢,我投了赞成票。我会尝试一下,如果一切都好,没有问题,我会接受的。再次感谢。事件在控件内(您可以使用
    this
    访问它),因此实际上它会自动侦听。当控件被销毁时,侦听器也被销毁。