【问题标题】:WPF change button content in user control while run methodWPF在运行方法时更改用户控件中的按钮内容
【发布时间】: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


【解决方案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!";
}

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多