当从共享代码发送到平台代码-Xamarin.forms时,Messeging center会多次点击

当从共享代码发送到平台代码-Xamarin.forms时,Messeging center会多次点击,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我知道这些问题被问了好几次。但我无法解决这个问题。在我的xamarin.forms应用程序中,我使用自定义相机视图在一个页面内显示相机。用于拍照的按钮位于共享代码中。为了从共享代码中拍照,我使用了消息中心。当我们单击按钮时,消息中心将从共享代码发送订阅“我的相机”自定义渲染,并执行拍照操作 我面临的问题是,消息中心的订阅部分将被多次命中。奇怪的是,每次点击按钮,订阅量都会增加。我添加了退订信息中心。那它就不会再打了。这个问题的原因是什么?感谢您的帮助 信息中心发送的我的共享代码部分。 priva

我知道这些问题被问了好几次。但我无法解决这个问题。在我的xamarin.forms应用程序中,我使用自定义相机视图在一个页面内显示相机。用于拍照的按钮位于共享代码中。为了从共享代码中拍照,我使用了消息中心。当我们单击按钮时,消息中心将从共享代码发送订阅“我的相机”自定义渲染,并执行拍照操作

我面临的问题是,消息中心的订阅部分将被多次命中。奇怪的是,每次点击按钮,订阅量都会增加。我添加了退订信息中心。那它就不会再打了。这个问题的原因是什么?感谢您的帮助

信息中心发送的我的共享代码部分。

private async void Capture_Tapped(object sender, EventArgs e)
        {
            try
            {                            
                MessagingCenter.Send<CameraPopup>(this, "CaptureClick");
                            }
            catch (Exception)
            {

            }

        }
                           
private async void Capture_Tapped(对象发送方,事件参数e)
{
尝试
{                            
MessagingCenter.Send(此为“CaptureClick”);
}
捕获(例外)
{
}
}
android摄像头自定义渲染上的Messing center订阅部分

  protected async override void OnElementChanged(ElementChangedEventArgs<Centraverse.Views.Clocking.CustomCamera.CameraPreview> e)
            {
                base.OnElementChanged(e);
                if (Control == null)
                {
                    cameraPreview = new CameraPreview(Context);
                    SetNativeControl(cameraPreview);
    
                    // This portion hitting multiple times
                    MessagingCenter.Subscribe<CameraPopup>(this,"CaptureClick", (sender) =>
                    {
                        
                        try
                        {
                            Log.Info("Reached here:","Try catch of first ");
                            if (DetectedFaceCount == 0)
                            {
                                //Do Action
                            }
                            else if (DetectedFaceCount == 1)
                            {                           
                                Control.Preview.StopFaceDetection();
                                Task.Run(() => takepicture());
                            }
                            else if (DetectedFaceCount > 1)
                            {
                              //Do Action
                            }
                        }
                        catch (Exception ex)
                        {
                            return;
                        }
    
                     //  MessagingCenter.Unsubscribe<CameraPopup>(this, "CaptureClick");
    
                    });
                }
                if (e.OldElement != null)
                {
                }
                if (e.NewElement != null)
                {
                    try
                    {
                        Control.Preview = Camera.Open((int)e.NewElement.Camera);
    
                        Device.BeginInvokeOnMainThread(async () =>
                        {                                          
                                Control.Preview.SetFaceDetectionListener(this);
                                Control.Preview.StartFaceDetection();                                    
                        });
    
                    }
                    catch (Exception ex)
                    {
                        return;
                    }
                   
                }
    
            }
protected async override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(Control==null)
{
cameraPreview=新cameraPreview(上下文);
SetNativeControl(cameraPreview);
//这一部分击中多次
MessagingCenter.Subscribe(此“CaptureClick”,(发件人)=>
{
尝试
{
Log.Info(“到达这里:,“尝试第一次捕获”);
如果(DetectedFaceCount==0)
{
//行动
}
else if(DetectedFaceCount==1)
{                           
Control.Preview.StopFaceDetection();
Task.Run(()=>takepicture());
}
否则如果(检测到的面计数>1)
{
//行动
}
}
捕获(例外情况除外)
{
返回;
}
//取消订阅(此为“CaptureClick”);
});
}
if(e.OldElement!=null)
{
}
if(例如NewElement!=null)
{
尝试
{
Control.Preview=Camera.Open((int)e.NewElement.Camera);
Device.beginInvokeMainThread(异步()=>
{                                          
Control.Preview.SetFaceDetectionListener(此);
Control.Preview.StartFaceDetection();
});
}
捕获(例外情况除外)
{
返回;
}
}
}

根据您的描述和代码,这可能只有一个原因-您多次订阅该活动。因此,您需要先取消订阅,或者使用一些您已订阅的内部跟踪机制,只执行一次。

在OnElementChanged中设置断点,并检查它实际触发了多少次。也许你订阅了很多次?否则,您可能会意外地连接了多次点击的捕获。@Cheesebaron OnElementChanged仅在“我的相机”页面加载时调用一次,但它会消失并再次显示吗?还是多重触发会立即发生?@Cheesebaron Bro最初,当我们点击按钮时,一切正常。问题发生在第二次之后。“MessagingCenter.Subscribe”将在第二次单击按钮时点击两次。。当我们再次单击按钮时,它将变成三次。您是否考虑过将对messenger的订阅置于构造函数中,而不是
OnElementChanged
?还有,不是你的兄弟。