【问题标题】:Xaml Disable Control untill its code behind is executedXaml 禁用控制,直到其后面的代码被执行
【发布时间】:2015-02-16 20:05:00
【问题描述】:

我做了一个如下图所示的自定义按钮

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

【问题讨论】:

  • 试试 myBtn.IsEnabled = false 怎么样?

标签: wpf xaml windows-runtime winrt-xaml


【解决方案1】:

不确定“禁用”的真正含义,但IsHitTestVisible 可能会在这里为您带来最大的收益。

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

// 祝你好运!

【讨论】:

  • 谢谢您的回答。但我没有以这种方式实现它。请检查我的答案,如果我错了,请纠正我。
【解决方案2】:

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

//许多网络调用

//更新本地数据库

//更新视图模型

// 呸呸呸呸……

在视图模型中,例如提供绑定到按钮的Command 属性的ICommandICommand 还应该实现 CanExecute() 方法,该方法会将您的按钮设置为启用或禁用状态。 然后你可以为你的按钮定义一个Style,让它看起来如你所愿。

所以最终你会得到这样的视图:

<Button Command="{Binding UpdateCommand}"/>

【讨论】:

    【解决方案3】:

    这就是我处理这种情况的方式。 我在这个特定的页面类中声明了一个标志,并在方法启动时将其值设置为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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多