C# Xamarin表单,快速按下按钮将打开2倍于相同窗口的窗口

C# Xamarin表单,快速按下按钮将打开2倍于相同窗口的窗口,c#,xamarin.forms,C#,Xamarin.forms,当我单击重定向到新窗口的图标时,它会打开相同的视图两次。我不知道如何处理它,只打开一个视图 示例xaml按钮 <local:AnimatedImage Grid.Column="2" Source="googlemap_view_search.png" HorizontalOptions="Center" VerticalOptions="Center" Margin="16,0"> <Image.Gest

当我单击重定向到新窗口的图标时,它会打开相同的视图两次。我不知道如何处理它,只打开一个视图

示例xaml按钮

<local:AnimatedImage Grid.Column="2" Source="googlemap_view_search.png"
                    HorizontalOptions="Center" VerticalOptions="Center" Margin="16,0">
                <Image.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding SearchCommand}" />
                </Image.GestureRecognizers>
            </local:AnimatedImage>

问题是,当您在执行搜索命令之前等待动画时,没有任何东西阻止用户再次启动该命令。您可以添加一个布尔变量,该变量在输入命令时设置为
true
,如果命令已在执行,则忽略第二次用户点击

private ICommand TransitionCommand
{
    get
    {
        bool isExecuting = false;
        return new Command(async () =>
        {
            if(isExecuting) return;
            isExecuting = true
            try
            {
                this.AnchorX = 0.48;
                this.AnchorY = 0.48;
                await this.ScaleTo(MAGNIFICATION_VALUE, 50, Easing.Linear);
                await Task.Delay(ANIMATED_TIME);
                await this.ScaleTo(INITIAL_VALUE, 50, Easing.Linear);
                if (Command != null)
                {
                    Command.Execute(CommandParameter);
                }
             }
             finally 
             {
                  isExecuting = false;
             }
        });
    }
}

Xamarin
Command
有一个方法,可以根据您的业务逻辑来阻止命令的执行

public ICommand SearchCommand {get; private set; }

bool _canSearch = true;
public bool CanSearch 
{ 
    get { return _canSearch; } 
    private set { 
        _canSearch = value;
        ((Command)SearchCommand).ChangeCanExecute(); 
    }
}

public SearchPageViewModel()
{
    SearchCommand = new Command(() => DoSearchStuff(), () => CanSearch)
}

void DoSearchStuff()
{
    CanSearch = false;
    // long searching stuff
    CanSearch = true;
}

希望这对每次调用getter时返回
新命令有所帮助?
private ICommand TransitionCommand
{
    get
    {
        bool isExecuting = false;
        return new Command(async () =>
        {
            if(isExecuting) return;
            isExecuting = true
            try
            {
                this.AnchorX = 0.48;
                this.AnchorY = 0.48;
                await this.ScaleTo(MAGNIFICATION_VALUE, 50, Easing.Linear);
                await Task.Delay(ANIMATED_TIME);
                await this.ScaleTo(INITIAL_VALUE, 50, Easing.Linear);
                if (Command != null)
                {
                    Command.Execute(CommandParameter);
                }
             }
             finally 
             {
                  isExecuting = false;
             }
        });
    }
}
public ICommand SearchCommand {get; private set; }

bool _canSearch = true;
public bool CanSearch 
{ 
    get { return _canSearch; } 
    private set { 
        _canSearch = value;
        ((Command)SearchCommand).ChangeCanExecute(); 
    }
}

public SearchPageViewModel()
{
    SearchCommand = new Command(() => DoSearchStuff(), () => CanSearch)
}

void DoSearchStuff()
{
    CanSearch = false;
    // long searching stuff
    CanSearch = true;
}