看看Xamarin的示例片段,我发现他们建议创建一个包含三个部分的自定义渲染器:
如果(Control == null)
如果(e.OldElement!= null)
如果(e.NewElement!= null)
我的渲染器看起来像这样。但是,我不明白我将使用if (Control == null)
部分做什么。
问题1)?有人可以给我建议如何使用它,以及我的实现是否有误?
问题2),我是否正确实施了此操作,以及如何/在何处删除OnTabbarControllerItemSelected
处理程序?
问题3):“控制”元素来自何处?这与我称为_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;
}
}
}
答案 0 :(得分:2)
问题1和3
该代码段用于编写自定义渲染器,Control
属性在ViewRenderer类中。由于您的控件继承自TabbedRenderer
,因此无需遵循摘要。
问题2
ViewController属性返回TabbedRenderer
本身,因此您不需要每次调用OnElementChanged
时都添加侦听器。考虑将其移至构造函数。
赞:
public class TabbedPageRenderer : TabbedRenderer
{
private MainPage _page;
public TabbedPageRenderer()
{
this.ViewControllerSelected += OnTabbarControllerItemSelected;
}
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
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;
}
if(_page != null)
UpdateTheme();
}
private void OnTabbarControllerItemSelected(object sender, UITabBarSelectionEventArgs eventArgs)
{
if (_page != null && !(_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;
}
}
}