WPF在运行方法时更改用户控件中的按钮内容
Posted
技术标签:
【中文标题】WPF在运行方法时更改用户控件中的按钮内容【英文标题】:WPF change button content in user control while run method 【发布时间】:2021-11-24 20:35:36 【问题描述】:我有一个按钮用户控件。 我想在执行用户点击事件时更改按钮内容。 我试试这个:
public static readonly RoutedEvent ClickProperty = EventManager.RegisterRoutedEvent(
nameof(Click), RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonProgress));
private async void btnButton_Click(object sender, RoutedEventArgs e)
btnButton.Content= "Please Wait...";
ExecuteClickEvent(); // Run User Click Event
btnButton.Content= "Its Done!";
//User click Event
public event RoutedEventHandler Click
add AddHandler(ClickProperty, value);
remove RemoveHandler(ClickProperty, value);
private void ExecuteClickEvent()
RoutedEventArgs newEventArgs = new RoutedEventArgs(ButtonProgress.ClickProperty);
RaiseEvent(newEventArgs);
但它不能正常工作。当我删除 btnButton.Content= "Its Done!"; 按钮内容将设置 "Please wait..." ,但是当我放 btnButton.Content = "Its Done!"; 按钮内容是“Its done!”一直以来。
【问题讨论】:
它可能执行得太快以至于你没有注意到? 问题是,按钮刷新在 Dispatcher 上排队。所以它在你的方法完成后执行。更好的方法是从 UI 线程中卸载ExecuteClickEvent
。使用 Task.Run()
之类的东西。
我用Task.Run,出现错误The calling thread cannot access this object because a different thread owns it.
您不能操作 UI 线程以外的 UI 控件。因此,您应该从 UI 线程中卸载 CPU 密集型工作。如果 ExecuteClickEvent 需要 UI 控件访问权限,则不能 TaskRun 它。是什么,消耗时间?
对不起,我的英语说得不太好。 ExecuteClickEvent 运行一个点击事件程序员定义:<userControl:ButtonProgress x:Name="btnLogin" Click="btnLogin_Click" />
。能给我一些代码吗?
【参考方案1】:
如果 ExecuteClickEvent()
正在调度程序线程上执行,您可以在调用它之前调用 Task.Delay
以使 UI 线程有机会更新按钮的内容:
private async void btnButton_Click(object sender, RoutedEventArgs e)
btnButton.Content = "Please Wait...";
await Task.Delay(1);
ExecuteClickEvent(); // Run User Click Event
btnButton.Content = "Its Done!";
【讨论】:
以上是关于WPF在运行方法时更改用户控件中的按钮内容的主要内容,如果未能解决你的问题,请参考以下文章