【问题标题】:Events are fired but dont change UI事件被触发但不改变 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

标签: c# wpf events


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2020-01-31
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多