Ala*_*an2 6 c# xamarin xamarin.forms
我在页面上使用这个iOS SegmentedControlRenderer.
但是当我以这种方式访问页面时:Navigation.PushAsync(new CFSPage())然后单击后退箭头转到上一页,我的客户iOS渲染器中的OnElementChanged事件被触发.我的渲染器的结果是以下行给出了一个空引用错误:
segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();
有人可以解释一下这个目的是什么?这里也应该在if (e.NewElement != null)检查之后或者它应该在支票内.我在说,下面几行应该纠正NOT如果没有为newElement被执行?
segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();
SetNativeControl(segmentedControl);
SetSelectedSegment();
Run Code Online (Sandbox Code Playgroud)
这个渲染器没有
protected override void Dispose(bool disposing)
Run Code Online (Sandbox Code Playgroud)
那是不是缺少的东西?
渲染
public class SegmentedControlRenderer : ViewRenderer<SegmentedControl, UISegmentedControl>
{
protected override void OnElementChanged(ElementChangedEventArgs<SegmentedControl> e)
{
base.OnElementChanged(e);
UISegmentedControl segmentedControl = null;
if (Control == null)
{
segmentedControl = new UISegmentedControl();
for (var i = 0; i < e.NewElement.Children.Count; i++)
{
segmentedControl.InsertSegment(Element.Children[i].Text, i, false);
}
SetNativeControl(segmentedControl);
SetSelectedSegment();
}
if (e.OldElement != null)
{
if (segmentedControl != null)
segmentedControl.ValueChanged -= NativeValueChanged;
}
if (e.NewElement != null)
{
segmentedControl.ValueChanged += NativeValueChanged;
}
segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();
SetNativeControl(segmentedControl);
SetSelectedSegment();
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof(SegmentedControl.SelectedSegment))
SetSelectedSegment();
if (e.PropertyName == SegmentedControl.TintColorProperty.PropertyName)
SetSegmentTintColor();
}
void NativeValueChanged(object sender, EventArgs e)
{
if (Element is SegmentedControl formsElement)
{
formsElement.SelectedSegment = (int)Control.SelectedSegment;
};
}
void SetSegmentTintColor()
{
if (Element is SegmentedControl formsElement)
Control.TintColor = formsElement.TintColor.ToUIColor();
}
void SetSelectedSegment()
{
if (Element is SegmentedControl formsElement)
{
if (formsElement.SelectedSegment >= 0 && formsElement.SelectedSegment < Control.NumberOfSegments)
Control.SelectedSegment = formsElement.SelectedSegment;
}
}
}
Run Code Online (Sandbox Code Playgroud)
OnElementChanged以下是大多数渲染器的结构示例:
protected override void OnElementChanged(ElementChangedEventArgs<Type> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Unsubscribe from event handlers and cleanup any resources
}
if (e.NewElement != null)
{
if (Control == null)
{
// Instantiate the native control and assign it to the Control property with
// the SetNativeControl method
}
// Configure the control and subscribe to event handlers
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,Control当为 true 时,可能为 null if (e.OldElement != null),并且在这种情况下通常不应重新创建。
另请参阅Xamarin.Forms iOS ButtonRenderer。
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |