在 Xamarin Forms 中為頁面內的 Frame 使用 Android 渲染器,我需要在頁面大小分配后更改此物件的位置。該頁面位于 Shell 的選項卡中,當我更改選項卡并回傳時,在渲染器中出現例外“無法訪問已處理的物件”。
例外發生在這一行 UpdatePos 上:
SetY(20);
我的問題已通過以下代碼重現:
這一頁 :
public partial class TestPage : ContentPage
{
public partial class Container : Frame
{
public delegate void PosChangedEvent();
public event PosChangedEvent HandlerPosUpdated;
public void Update()
{
HandlerPosUpdated?.Invoke();
}
}
Container _container = null;
public TestPage()
{
InitializeComponent();
_container = new Container()
{
Content = new myView()
};
main_layout.Children.Add(_container);
}
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
_container.Update();
}
}
渲染器:
public class ContainerRenderer : ViewRenderer<Frame, Android.Views.View>
{
public ContainerRenderer(Context context) : base(context)
{}
public void UpdatePos()
{
SetY(20); // System.ObjectDisposedException: 'Cannot access a disposed object. Object name: 'ContainerRenderer'.'
}
protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
TestPage.Container view = e.NewElement as TestPage.Container;
if (view != null)
{
view.HandlerPosUpdated = UpdatePos;
}
}
if (e.OldElement != null)
{
TestPage.Container view = e.OldElement as TestPage.Container;
if (view != null)
{
view.HandlerPosUpdated -= UpdatePos;
}
}
}
}
如何避免這種例外?
歡迎任何提示!
uj5u.com熱心網友回復:
處理自定義渲染器時洗掉該處理程式:
private bool disposedValue;
protected override void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
RemoveHandlerPosUpdated();
}
disposedValue = true;
}
base.Dispose(disposing);
}
private void RemoveHandlerPosUpdated()
{
if (Element != null)
{
TestPage.Container view = Element as TestPage.Container;
if (view != null)
{
view.HandlerPosUpdated -= UpdatePos;
}
}
}
如果這不能解決它,那么可能需要在TestPage.Container課堂上做一些事情,以洗掉附加到HandlerPosUpdated. 詳情待定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/402242.html
標籤:安卓 沙马林 xamarin.forms 自定义渲染器
