加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#WPF – 长按操作按钮单击

发布时间:2020-12-15 20:53:52 所属栏目:百科 来源:网络整理
导读:我有Button,它在点击时调用另一种方法. 另一种方法执行的操作可能需要很长时间…… 所以我想创建一个出现在操作开始的Label并告诉用户等待,在操作完成后,Label将消失.唯一的问题是因为Button是一个UI元素(这就是我认为的原因),更改Button内部的Label的调用只
我有Button,它在点击时调用另一种方法.
另一种方法执行的操作可能需要很长时间……
所以我想创建一个出现在操作开始的Label并告诉用户等待,在操作完成后,Label将消失.唯一的问题是因为Button是一个UI元素(这就是我认为的原因),更改Button内部的Label的调用只在Button点击完成后激活…(所以基本上Label是在点击之前不可见,并且在它期间不能改变,所以它保持这种方式).

这是我的代码:

private void SearchButtonActions()
{
        UI.InvokeA(() => lstFiles.ItemsSource = FDItems);
        bool SearchAndListing = false;
        //UI.InvokeA(() => lblWait.Height = double.NaN);
        //UI.InvokeA(() => lblWait.Visibility = Visibility.Visible);
        //UI.InvokeA(() => lblWait.Content = "Search Started...");
        int index = cbTypes.SelectedIndex;
        string selecteditem = cbSearchOption.SelectedItem.ToString();
        SearchAndListing = FD.Search(index,selecteditem);
        FDItems = new ObservableCollection<Item>(FD.Items);
        //UI.InvokeA(() => lblWait.Height = 0);
        //UI.InvokeA(() => lblWait.Visibility = Visibility.Hidden);
        //UI.InvokeA(() => lblWait.Content = "Search Ended.");
        if (SearchAndListing)
        {
            UI.InvokeA(() => lstFiles.ItemsSource = FDItems);
            UI.InvokeA(() => lblCount.Content = string.Format("Items: {0}",FDItems.Count));
        }
}

我在谈论改变lblWait的方法……
顺便说一句:UI.Invoke – 是Dispatcher.Current.InvokeAsync(Action)的快捷方式

我已经尝试使用Tasks,BackGroundWorker,并将UI.Invoke更改为Invoke(同步而不是异步),所有都没有用…

有人可以帮忙吗?

解决方法

我以前遇到过这个问题,直到现在才开始考虑它.

你的论点是正确的,UI线程当前正在运行Click方法,所以它很忙,不会运行任何其他东西.

即使使用调度程序,它仍然执行click方法,因此ui线程会弹出下一个委托,只有在完成后才能运行.

所以这不起作用:

lbl.Visibility = Visibility.Visible;
   Thread.Sleep(3000);

这不起作用:

Dispatcher.Invoke(() => lbl.Visibility = Visibility.Visible);
    Dispatcher.Invoke(() => Thread.Sleep(3000));

什么工作是从后台线程调度ui操作.

XAML:

<StackPanel>   
       <Button Click="Button_Click" Content="Click"/>
       <Label x:Name="lbl" Content="Label" Visibility="Hidden" Foreground="Red" FontSize="22" HorizontalAlignment="Center"/>
     </StackPanel>

CS:

private async void Button_Click(object sender,RoutedEventArgs e)
    {
        await Dispatcher.InvokeAsync(() => 
        {
            Debug.WriteLine("Visibility");
            lbl.Visibility = Visibility.Visible;                
        });

        await Task.Run(() =>
        {
            return Dispatcher.InvokeAsync(() => Thread.Sleep(3000));
        });            
    }

仅供参考:您可能想知道为什么我不使用调度程序将Visibility值传播到UI线程.这是因为每个DispatcherObject(我们的DependencyObject派生自DispatcherObject)将执行传播到它关联的Dispatcher.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读