事件被触发但不改变 UI
Posted
技术标签:
【中文标题】事件被触发但不改变 UI【英文标题】:Events are fired but dont change UI 【发布时间】:2021-10-27 11:07:22 【问题描述】:我对事件比较陌生,我试图了解为什么我的代码不能正常工作。我想在动作开始时触发一个事件,将标签文本设置为“开始”,当方法完成时,标签会说“完成”。到目前为止非常基本。两个事件都被触发了,但是在 StartEvent 中,UI-Label 没有被更新,尽管我在EventsClassOnStartedWorkEvent
设置了一个断点。该行正在执行,但标签没有被更改。我还在DoWork()
中尝试了更长的执行时间。循环完成后,FinishedWorkEvent
会正确更改 UI-Label。
我尝试过的:订阅 MainWindow
构造函数中的事件。
提前致谢。
using EventsNamespace;
using System;
namespace DLL
class EventsClass
public event TestEventEventHandler FinishedWorkEvent;
public event TestEventEventHandler StartedWorkEvent;
public void DoWork()
StartedWorkEvent(this,new UIEventArgs("started"));
for (int i = 0; i < 1000000000; i++)
int sum = 0;
FinishedWorkEvent(this, new UIEventArgs("Finished"));
namespace EventsNamespace
public delegate void TestEventEventHandler(object sender, UIEventArgs e);
public class UIEventArgs : EventArgs
public string Result get; set;
public UIEventArgs(string result)
Result = result;
using DLL;
using EventsNamespace;
using System.Windows;
namespace EventsTestUI
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
private EventsClass eventsClass;
public MainWindow()
InitializeComponent();
eventsClass = new EventsClass();
private void EventsClassOnFinishedWorkEvent(object sender, UIEventArgs e)
ResultLabel.Content = e.Result;
private void EventsClassOnStartedWorkEvent(object sender, UIEventArgs e)
ResultLabel.Content = e.Result;
private void StartButton_Click(object sender, RoutedEventArgs e)
eventsClass.StartedWorkEvent += EventsClassOnStartedWorkEvent;
eventsClass.FinishedWorkEvent += EventsClassOnFinishedWorkEvent;
eventsClass.DoWork();
【问题讨论】:
感谢您的回复 @Angevil 我现在已经制作了DoWork()
async
并且它有效。我通过使用:await Task.Run( ()=> //while loop in here]);
并在任务之前/之后触发事件。你是这个意思吧?
试试Dispatcher.Invoke( () =>ResultLabel.Content = e.Result );
见here
【参考方案1】:
我在控制台应用程序中测试了您的代码流,并触发了事件(您可以通过在事件处理程序中添加 Console.WriteLine()
进行测试)。
所以我很确定这里的问题不在于事件本身。
如果我没记错的话,在 WPF 中你只有 1 个线程来刷新 UI,并且它是处理用户引发的事件(例如单击该开始按钮)的同一线程。
这意味着事件可能已被触发,并且标签的内容已更改,但 UI 直到线程完成 DoWork()
才会刷新,因此在此之前您不会在 UI 上看到任何更改。
纠正此问题的一种方法是异步调用 DoWork
=> 另一个线程负责完成工作,并在需要时释放 UI 线程以刷新 UI。
【讨论】:
以上是关于事件被触发但不改变 UI的主要内容,如果未能解决你的问题,请参考以下文章
请问C# Winform项目中子类的事件被触发时,怎么跨类更新UI。
在element-ui组件select选择器的change事件中传递自定义参数