0

我对 C# 很陌生,我正在开发一个 WPF 应用程序,该应用程序有一个后台进程,可以长时间连接 Web 服务。当我从 Web 服务中获取某些代码时,我将启动方法。除了创建“烤面包机”弹出消息的工作之外,我已经完成了所有工作。我创建了一个表单来充当烤面包机的弹出窗口。我的问题是它是从 backroundWorker 线程调用的,它只执行一次并且不会向上滑动屏幕。升起屏幕的定时器功能不运行。为简单起见,我使用了之前回答的问题中的代码:

public partial class Form1 : Form
{
    private Timer timer;
    private int startPosX;
    private int startPosY;

    public Form1()
    {
        InitializeComponent();
        // We want our window to be the top most
        TopMost = true;
        // Pop doesn't need to be shown in task bar
        ShowInTaskbar = false;
        // Create and run timer for animation
        timer = new Timer();
        timer.Interval = 50;
        timer.Tick += timer_Tick;
    }

    protected override void OnLoad(EventArgs e)
    {
        // Move window out of screen
        startPosX = Screen.PrimaryScreen.WorkingArea.Width - Width;
        startPosY = Screen.PrimaryScreen.WorkingArea.Height;
        SetDesktopLocation(startPosX, startPosY);
        base.OnLoad(e);
        // Begin animation
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        //Lift window by 5 pixels
        startPosY -= 5; 
        //If window is fully visible stop the timer
        if (startPosY < Screen.PrimaryScreen.WorkingArea.Height - Height)
            timer.Stop();
        else
           SetDesktopLocation(startPosX, startPosY);
    }
}

然后在我的 bgWorker_DoWork 方法中,我有:

    var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,
object>>(responseFromServer);
int notifyType = (int)dict["notificationType"];
switch (notifyType)
{ 
   case 6:
         Debug.WriteLine(responseFromServer);  Form1 popup = new Form1();
         popup.Show();
         break; 
    default:
         Debug.WriteLine(responseFromServer);
         break; 
}

作为 C# 的新手,我不知道如何在完全显示烤面包机消息之前保持计时器方法的执行。

或者有没有比表单更好的方法来实现这个 toast 弹出窗口?

请帮忙??谢谢你。

4

1 回答 1

0

您不能依赖此工作,因为它使用的是不同的线程。
您需要将弹出窗口的创建分派到主 UI 线程


抱歉误读了问题和 postet Winforms 解决方案。更新!

使用 Control.Invoke

    public Form1()
    {
        InitializeComponent();

    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       /* this.Invoke((Action)(() =>
                        {
                            var form2 = new Form2();
                            form2.Show();
                        }));  Winforms Method*/
         Dispatcher.Invoke((Action)(() =>
                        {
                            var form2 = new Form2();
                            form2.Show();
                        }));

    }

    private void Form1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

实际上,您可以在单独的线程上创建窗口。网上有很多关于如何做到这一点的教程。但请记住,控件只能在创建它们的线程上访问。

于 2013-09-13T17:39:14.603 回答