Xaml 禁用控件,直到执行其后面的代码
Xaml Disable Control untill its code behind is executed
我做了一个自定义按钮如下图
<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 tap,直到 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,点击事件就会被注册并且函数, 完成执行后,再次开始执行。
如何停止 myBtn 的点击事件注册,直到它的代码隐藏在事务中?
不要在代码隐藏中实现您的应用程序逻辑。这违反了 MVVM 的想法。你应该实施你的
//Many Network Calls
//Updating Local DB
//Updating ViewModels
// Blah Blah Blah...
在视图模型中,例如提供绑定到按钮的 Command
属性 的 ICommand
。 ICommand
还应实施 CanExecute()
方法,将您的按钮设置为启用或禁用状态。
然后你可以为你的按钮定义一个Style
,这样它看起来就如你所愿。
所以最后你的观点是这样的:
<Button Command="{Binding UpdateCommand}"/>
不确定 "disabled" 的真正含义,但 IsHitTestVisible
可能会给您带来最大的收益。
async ClickHandler(sender, events)
{
Control.IsHitTestVisible = false;
await GetDataAsync();
Control.IsHitTestVisible = true;
}
// 祝你好运!
这就是我处理这种情况的方式。
我在此特定页面中声明了一个标志 class 并在方法开始时将其值设置为 true
并且当我的工作完成时,将其设置为 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;
}
}
我做了一个自定义按钮如下图
<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 tap,直到 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,点击事件就会被注册并且函数, 完成执行后,再次开始执行。
如何停止 myBtn 的点击事件注册,直到它的代码隐藏在事务中?
不要在代码隐藏中实现您的应用程序逻辑。这违反了 MVVM 的想法。你应该实施你的
//Many Network Calls
//Updating Local DB
//Updating ViewModels
// Blah Blah Blah...
在视图模型中,例如提供绑定到按钮的 Command
属性 的 ICommand
。 ICommand
还应实施 CanExecute()
方法,将您的按钮设置为启用或禁用状态。
然后你可以为你的按钮定义一个Style
,这样它看起来就如你所愿。
所以最后你的观点是这样的:
<Button Command="{Binding UpdateCommand}"/>
不确定 "disabled" 的真正含义,但 IsHitTestVisible
可能会给您带来最大的收益。
async ClickHandler(sender, events)
{
Control.IsHitTestVisible = false;
await GetDataAsync();
Control.IsHitTestVisible = true;
}
// 祝你好运!
这就是我处理这种情况的方式。
我在此特定页面中声明了一个标志 class 并在方法开始时将其值设置为 true
并且当我的工作完成时,将其设置为 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;
}
}