C# 如何防止快速单击多个控件?

C# 如何防止快速单击多个控件?,c#,android,xamarin,xamarin.android,xamarin.forms,C#,Android,Xamarin,Xamarin.android,Xamarin.forms,在Android上的Xamarin.Forms PCL项目中,我面临一个阻止快速多控件单击的问题。基本上,我需要解决以下四种情况: 单击导航栏中的按钮和后退按钮 单击按钮和硬件后退按钮 同时单击两个或多个按钮 多次单击同一按钮 我使用的导航页面有3页-主页面、第二页和第三页。每个页面上都有处理导航的按钮 MainPage.xaml.cs public async void NavigateToSecondPage(object s, EventArgs e) {

在Android上的Xamarin.Forms PCL项目中,我面临一个阻止快速多控件单击的问题。基本上,我需要解决以下四种情况:

  • 单击导航栏中的按钮和后退按钮
  • 单击按钮和硬件后退按钮
  • 同时单击两个或多个按钮
  • 多次单击同一按钮
  • 我使用的导航页面有3页-主页面、第二页和第三页。每个页面上都有处理导航的按钮

    MainPage.xaml.cs

        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new SecondPage());
        }
    
        public async void NavigateToMainPage(object s, EventArgs e)
        {
            if(await DisplayAlert("Alert", "Are you really sure you want to navigate back?", "yes", "no"))
                await Navigation.PopAsync();
        }
    
        public async void NavigateToThirdPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new ThirdPage());
        }
    
        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PopAsync();
        }
    
    SecondPage.xaml.cs

        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new SecondPage());
        }
    
        public async void NavigateToMainPage(object s, EventArgs e)
        {
            if(await DisplayAlert("Alert", "Are you really sure you want to navigate back?", "yes", "no"))
                await Navigation.PopAsync();
        }
    
        public async void NavigateToThirdPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new ThirdPage());
        }
    
        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PopAsync();
        }
    
    ThirdPage.xaml.cs

        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new SecondPage());
        }
    
        public async void NavigateToMainPage(object s, EventArgs e)
        {
            if(await DisplayAlert("Alert", "Are you really sure you want to navigate back?", "yes", "no"))
                await Navigation.PopAsync();
        }
    
        public async void NavigateToThirdPage(object s, EventArgs e)
        {
            await Navigation.PushAsync(new ThirdPage());
        }
    
        public async void NavigateToSecondPage(object s, EventArgs e)
        {
            await Navigation.PopAsync();
        }
    
    第一个和第二个场景导致问题,来自SecondPage“NavigateToMainPage”事件处理程序的MessageBox位于MainPage上。第三种情况类似,但第二页的MessageBox位于第三页。最后一个场景导致在NavigationStack上多次堆叠同一页面

    是否有解决方案涵盖所有这些场景?这个问题也适用于本地Android开发人员


    您可以使用全局布尔值“canClick”。默认情况下,将其设置为true。单击时,检查是否为false。如果为false,则不执行任何操作(正在处理另一次单击),如果为true,则将其设置为false,开始通常在该按钮上执行的操作,然后在完成后再次将其设置为true(以处理以后的单击)

    在执行异步方法时,可能必须设置变量public和static,才能从“FirstPage”“SecondPage”访问它。。。对象,以便在正确加载时将其设置为false

    另一种方法包括两个自定义函数“allowClicks()”和“ForbiddeClicks()”。禁用禁止单击上的所有按钮,在allowClicks中启用它们。当用户点击一个按钮时调用禁止,然后在您的治疗完成时调用允许按钮。根据您的治疗方法,您可能必须使这些函数成为静态函数(这可能是不可能的)

    我希望这有帮助

    编辑:代码示例

    public static void disableButtons() {
        button1.setEnabled(false);
        button2.setEnabled(false);
        button3.setEnabled(false);
        button4.setEnabled(false);
    }
    public static void enableButtons() {
        button1.setEnabled(true);
        button2.setEnabled(true);
        button3.setEnabled(true);
        button4.setEnabled(true);
    }
    
    然后调用类。disableButtons();在每个按钮上单击。然后在治疗完成后“yourClass.enableButtons();”。我不能更准确地说,因为我不知道你是否完全使用android(那么,你在某处有一个活动),你的“页面”是活动还是片段。。。等等

    代码的其余部分取决于它。如果每个页面都是一个活动,我几乎可以肯定这会更复杂,因为对暂停的活动进行UI更改是不安全的。如果页面是片段,则可能必须使用接口和片段函数,而不是静态函数

    你对你正在做的事情不够精确,所以我在代码上再精确不过了

    但是,让我们像我首先说的那样尝试,假设您只有一个活动,并且每个页面都是该活动的“布局”(而不是片段)。代码如下所示:

    private boolean canClick=true;
    
    在onCreate()中:


    您对每个按钮使用相同的代码,根据需要定制每个治疗。您也可以将“canClick=false;”替换为“disableButtons();”并将“canClick=true”替换为“enableButtons();”,如果您使用的是类似于上述代码的函数,则可以删除if语句。

    能否更具体一点,并向我提供您如何解决所有情况的代码?@Jan Look answer edit。我不能说得更精确,因为我不知道xamarin的形式,也不知道程序的生命周期。所以我把它做成了只有安卓系统的样子,没有碎片。如果涉及到片段(或等价物),或者如果每个页面都是一个活动(或等价物),那么事情会变得更复杂。不过,我几乎可以肯定,如果您使用不同的活动作为页面,问题将不会发生。谢谢您帮助我解决这个问题。您将如何涵盖第一个场景?单击按钮,然后立即单击导航栏中的“后退”按钮?是否有订阅后退按钮的活动?我知道硬件后退按钮有一个事件,但我在NavBar中找不到订阅后退按钮事件的任何事件。如果您指的是操作栏,则是activity中的“public void onBackPressed()”。您可以使用“getActivity().onBackPressed();”从片段调用它。如果您覆盖了它,请不要忘记调用super.onBackPressed(),如果您不处理该应用程序,那么用户将能够在不终止应用程序的情况下完成活动。