Xaml禁用控制,直到执行代码隐藏

时间:2015-01-28 05:58:46

标签: wpf xaml windows-runtime winrt-xaml

我已经制作了一个自定义按钮,如下所示

<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停止点击事件注册,直到其后面的代码在事务中?

3 个答案:

答案 0 :(得分:2)

不确定“禁用”究竟意味着什么,但IsHitTestVisible可能会给你最好的帮助。

async ClickHandler(sender, events)
{
    Control.IsHitTestVisible = false;
    await GetDataAsync();
    Control.IsHitTestVisible = true;
}

//祝你好运!

答案 1 :(得分:1)

不要在代码隐藏中实现您的应用程序逻辑。这违反了MVVM的想法。你应该实现你的

  

//许多网络电话

     

//更新本地数据库

     

//更新ViewModels

     

// Blah Blah Blah ......

视图模型中的

,例如提供绑定到按钮ICommand属性的CommandICommand也应该实现将您的按钮设置为启用或禁用状态的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;
    }
}