我已经制作了一个自定义按钮,如下所示
<Border x:Name="myBtn" Grid.Column="0" Width="320" Height="100" Margin="10" HorizontalAlignment="Right" Style="{StaticResource myBtnStyle}" Tapped="myBtn_Tapped">
<Grid>
<TextBlock x:Uid="TBmyBtn" Margin="100,20,20,20" Text="Update" Style="{StaticResource myTBStyle}"/>
</Grid>
</Border>
其抽头事件如下所示
private async void myBtn_Tapped(object sender, TappedRoutedEventArgs e)
{
//Many Network Calls
//Updating Local DB
//Updating ViewModels
// Blah Blah Blah...
}
如果我点击我的自定义按钮(myBtn),其后面的代码开始执行,并且因为有很多网络调用,所以完成myBtn_Tapped函数需要一些时间。
现在我的要求是,我应该禁用myBtn点击,直到myBtn_Tapped完成执行。
我试过的是
private async void myBtn_Tapped(object sender, TappedRoutedEventArgs e)
{
myBtn.IsTapEnabled=False;
//Many Network Calls
//Updating Local DB
//Updating ViewModels
// Blah Blah Blah...
myBtn.IsTapEnabled=True;
}
但是我注意到即使在myBtn.IsTapEnabled=False;
之后,如果我点击myBtn一次,并且当myBtn_Tapped函数正在执行时,如果我再次点击myBtn,则在完成执行后,tap事件被注册并且函数被执行,再次开始执行。
如何为myBtn停止点击事件注册,直到其后面的代码在事务中?
答案 0 :(得分:2)
不确定“禁用”究竟意味着什么,但IsHitTestVisible
可能会给你最好的帮助。
async ClickHandler(sender, events)
{
Control.IsHitTestVisible = false;
await GetDataAsync();
Control.IsHitTestVisible = true;
}
//祝你好运!
答案 1 :(得分:1)
不要在代码隐藏中实现您的应用程序逻辑。这违反了MVVM的想法。你应该实现你的
视图模型中的//许多网络电话
//更新本地数据库
//更新ViewModels
// Blah Blah Blah ......
,例如提供绑定到按钮ICommand
属性的Command
。 ICommand
也应该实现将您的按钮设置为启用或禁用状态的CanExecute()
方法。
然后,您可以为按钮定义Style
,使其看起来如您所愿。
所以最后你最终会得到这样的观点:
<Button Command="{Binding UpdateCommand}"/>
答案 2 :(得分:0)
这就是我处理这种情况的方法。
我在这个特定的页面类中声明了一个标志&amp;方法开始时将其值设置为true
&amp;当我的工作完成后,将其设置为false
。
public class myControl : UserControl
{
public bool IsWorking { get; set; }
private async void myBtn_Tapped(object sender, TappedRoutedEventArgs e)
{
if (IsWorking) //These 2 statements did the magic.!!
return;
IsWorking= true;
//Many Network Calls
//Updating Local DB
//Updating ViewModels
// Blah Blah Blah...
IsWorking= false;
}
}