Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重置WPF的控件_C#_Wpf_Multithreading - Fatal编程技术网

C# 重置WPF的控件

C# 重置WPF的控件,c#,wpf,multithreading,C#,Wpf,Multithreading,几个月前我开始使用C#和WPF,现在我想我应该尝试学习一些新技术,比如使用线程。因此,我有一个应用程序,我想一直运行(使用无限while循环),但每分钟显示一次对话框(主窗口)。因此,我使用线程来实现这一点,下面是我如何实现这一点的: public MainWindow() { InitializeComponent(); while (true) { callmyfunction() system.Threading.Thread.Sl

几个月前我开始使用C#和WPF,现在我想我应该尝试学习一些新技术,比如使用线程。因此,我有一个应用程序,我想一直运行(使用无限while循环),但每分钟显示一次对话框(主窗口)。因此,我使用线程来实现这一点,下面是我如何实现这一点的:

public MainWindow()
{
    InitializeComponent();
    while (true)
    {
        callmyfunction()
         system.Threading.Thread.Sleep(1000);
    }
}
在我的callmyfunction()中,我正在调用对话框(它是主WPF应用程序),以便显示它。我是这样做的:

public void callmyfunction()
{
    this.ShowDialog();
}
我有一个常规按钮,当你点击它时,它会隐藏主窗口。我的按钮功能如下:

private void Button_Click2(object sender, RoutedEventArgs e)
{
    this.Hide();
}
所以我正在做的是,我正在正常加载主窗口,它有一个按钮,当我点击该按钮时,它应该隐藏主窗口,窗口应该按照我在thread.sleep中指定的毫秒睡眠,然后它会醒来,然后再次出现对话框,它会显示按钮等等。这个循环对我来说很好,但我遇到的问题是,在第一个对话框出现后,我点击按钮隐藏主窗口,第二次主窗口出现时,按钮将显示为“按下”按钮,而不是新按钮。我想这是因为第一次主窗口出现时我“按下”了它。直到我停止程序并再次运行它,它才会停止


所以我的问题是,你知道我如何“重置”按钮控制吗?还是需要重置鼠标单击事件?这方面的任何指针都会有帮助。

您应该在后台线程上运行循环。如果在UI线程上运行,应用程序将无法响应用户输入

在后台线程上运行某些代码的最简单且推荐的方法是启动新的
任务

还要注意,您不能从后台线程访问窗口,因此需要使用dispatcher将调用封送回UI线程

下面的示例代码应该会告诉您这个想法

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                Dispatcher.Invoke(() => callmyfunction());
                System.Threading.Thread.Sleep(5000);
            }
        }, TaskCreationOptions.LongRunning);
    }

    public void callmyfunction()
    {
        WindowState = WindowState.Normal;
    }

    private void Button_Click2(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Minimized;
    }
}

构造函数中的无限循环是非常糟糕的idea@sir鲁福怎么会这样?您能详细说明一下吗?您不能从无限运行的构造函数构造实例。构造函数在末尾返回一个实例,它应该返回,但您的实例没有返回,因为存在一个开放的端点。应用程序生命周期大致如下:1。创建主窗口2。启动应用程序的消息循环。如果没有该消息循环,您的应用程序将无法按预期工作。您的申请将在第1点终止。@Rufo爵士,好的。谢谢你的指点。那么,如果我想让我的应用程序不停地连续运行,我能采取的最佳方法是什么?这就是我最终想要实现的。它应该隐藏主窗口,并且窗口应该按照我在线程中指定的毫秒进行睡眠。睡眠,然后它会被计时器唤醒。你的观点是什么?我发布的示例代码在单击按钮并将其还原到循环中时最小化了窗口。这一点很好。是的,可能应该是这样,因为它正在执行一个无限循环。我编辑了我的答案。我的观点是:窗口将在0到1000毫秒内恢复,而不是隐藏后的1000毫秒。一个简单的计时器就足够了