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

C#WPF – 长按 *** 作按钮单击,第1张

概述我有Button,它在点击时调用另一种方法. 另一种方法执行的 *** 作可能需要很长时间…… 所以我想创建一个出现在 *** 作开始的Label并告诉用户等待,在 *** 作完成后,Label将消失.唯一的问题是因为Button是一个UI元素(这就是我认为的原因),更改Button内部的Label的调用只在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线程会d出下一个委托,只有在完成后才能运行.

所以这不起作用:

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.

总结

以上是内存溢出为你收集整理的C#WPF – 长按 *** 作按钮单击全部内容,希望文章能够帮你解决C#WPF – 长按 *** 作按钮单击所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1226503.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存