事件被触发但不改变 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( ()=&gt; //while loop in here]); 并在任务之前/之后触发事件。你是这个意思吧? 试试Dispatcher.Invoke( () =&gt;ResultLabel.Content = e.Result );见here 【参考方案1】:

我在控制台应用程序中测试了您的代码流,并触发了事件(您可以通过在事件处理程序中添加 Console.WriteLine() 进行测试)。 所以我很确定这里的问题不在于事件本身。

如果我没记错的话,在 WPF 中你只有 1 个线程来刷新 UI,并且它是处理用户引发的事件(例如单击该开始按钮)的同一线程。

这意味着事件可能已被触发,并且标签的内容已更改,但 UI 直到线程完成 DoWork() 才会刷新,因此在此之前您不会在 UI 上看到任何更改。

纠正此问题的一种方法是异步调用 DoWork => 另一个线程负责完成工作,并在需要时释放 UI 线程以刷新 UI。

【讨论】:

以上是关于事件被触发但不改变 UI的主要内容,如果未能解决你的问题,请参考以下文章

请问C# Winform项目中子类的事件被触发时,怎么跨类更新UI。

UI事件监听的击穿

在element-ui组件select选择器的change事件中传递自定义参数

在element-ui组件select选择器的change事件中传递自定义参数

UI事件

Jquery问题:有一组name同为“tes”的radio,当被选中项发生改变时,触发一个事件,并在这个事件的