【发布时间】: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" />。能给我一些代码吗?
标签: c# wpf user-controls