什么';这是“什么?”;如果(控制==null)";在Xamarin iOS渲染器中用于的节?
查看Xamarin的一个示例片段,我看到他们建议创建一个包含三个部分的自定义渲染器:什么';这是“什么?”;如果(控制==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
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
访问它),因此实际上它会自动侦听。当控件被销毁时,侦听器也被销毁。