亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時取消掛鉤 Xamarin 自定義渲染器中的事件

何時取消掛鉤 Xamarin 自定義渲染器中的事件

C#
開滿天機 2022-01-15 19:39:19
眾所周知,當在代碼中連接事件處理時,我們冒著將對象留在內存中的風險,從而造成內存泄漏。為了實現一些特殊功能(禁用剪切和復制),我需要在 UWP 上實現自定義渲染器。雖然禁用剪切和復制與我必須連接事件處理程序才能實現這一點的問題并不嚴格相關。protected override void OnElementChanged(ElementChangedEventArgs<Editor> e){    base.OnElementChanged(e);    if (this.Control == null) { return; }    this.Control.CopyingToClipboard += Control_CopyingToClipboard;    this.Control.CuttingToClipboard += Control_CuttingToClipboard;}private void Control_CuttingToClipboard(TextBox sender,                                         TextControlCuttingToClipboardEventArgs args){    args.Handled = true;}private void Control_CopyingToClipboard(TextBox sender,                                         TextControlCopyingToClipboardEventArgs args){    args.Handled = true;}問題解開這些事件處理程序以防止任何形式的泄漏的正確位置是什么?我注意到平臺名稱空間中IDisposable沒有實現VisualElementRenderer<TElement, TNativeElement>,UWP但是我無法可靠地證明它被調用了。更新根據Micha? ?o?nieruk的建議,我在OldElement不為 null的檢查中添加了 unhooking,但我從未看到任何證據證明這會被調用。protected override void OnElementChanged(ElementChangedEventArgs<Editor> e){    base.OnElementChanged(e);    if (this.Control == null) { return; }    if (e.OldElement != null)    {        System.Debug.WriteLine("I NEVER SEE THIS");        this.Control.CopyingToClipboard -= Control_CopyingToClipboard;        this.Control.CuttingToClipboard -= Control_CuttingToClipboard;    }    if (e.NewElement != null)    {        this.Control.CopyingToClipboard += Control_CopyingToClipboard;        this.Control.CuttingToClipboard += Control_CuttingToClipboard;    }}當從 UI 中刪除控件時,是否應該清理這些渲染器并因此觸發該OnElementChanged方法?
查看完整描述

1 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

在此處查看有關自定義渲染器的文章:實現視圖 它包含自定義渲染器的 OnElementChanged 方法的模板:


protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e)

{

  base.OnElementChanged (e);


  if (Control == null) {

    // Instantiate the native control and assign it to the Control property with

    // the SetNativeControl method

  }


  if (e.OldElement != null) {

    // Unsubscribe from event handlers and cleanup any resources

  }


  if (e.NewElement != null) {

    // Configure the control and subscribe to event handlers

  }

}

因此,您應該在 OldElement 不為 null 時取消掛鉤事件,并在出現 NewElement 時掛鉤它們。


至于評論中的后續問題(如果上面的第二個沒有被觸發,我們是否應該取消訂閱):我的理解是這兩個對象的生命周期(所以渲染器和本機控件)是相同的,在這種情況下沒有需要手動取消訂閱事件。如果我錯了,請糾正我。


查看完整回答
反對 回復 2022-01-15
  • 1 回答
  • 0 關注
  • 157 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號