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在运行方法时更改用户控件中的按钮内容的主要内容,如果未能解决你的问题,请参考以下文章

为什么我的样式在WPF中设置用户按钮控件内容时消失了?

wpf中用户控件更改期间的动画

处理 WPF 用户控件的事件

C#WPF用户控件没有show()方法,那怎么实现单击一个按钮后弹出一个用户控件呢?

通过WPF中的命令绑定使整个用户控件可单击

UserControl在wpf中使用父元素?