UI繁忙时忽略用户输入

时间:2019-02-02 01:26:59

标签: c# wpf multithreading

我将通过在示例应用程序中单击两个按钮来模拟我的问题。在我的实际情况下,我有一个TabControl沿用户控件。当在UserControl上按下按钮时,我试图获取父窗口并将其禁用,并在UI上执行一些工作1分钟。释放UI后,我将启用父窗口。

我的问题是当ParentWindow被禁用,并且当在TabControl的用户点击,只要用户界面是忙它仍然没有响应。但只要做UI的工作,所有的用户输入被考虑到,它本身切换标签。用户界面繁忙时,我想忽略用户输入,请帮助。有什么建议么?

在这里的示例应用程序是XAML

<StackPanel Orientation="Vertical">
        <Button Height="20" Width="180" Click="Button_Click"
                >Hello</Button>
        <Button Height="20" Width="180" Click="Button_Click_1">Do Nothing</Button>
    </StackPanel>

在xaml.cs文件中,这里是代码。看到我禁用了Window,但是当按下按钮时,在UI空闲之后我会自动收到问候消息。

private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Hello");
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Window.GetWindow(this).IsEnabled=false;
            Thread.Sleep(5000);
            Window.GetWindow(this).IsEnabled=true;
        }

1 个答案:

答案 0 :(得分:0)

只需在新线程中运行长时间运行的代码

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Task.Run(() =>
        {
            try
            {
                this.Dispatcher.Invoke(() =>
                {
                    Window.GetWindow(this).IsEnabled = false;
                });
                Thread.Sleep(5000);
            }
            finally
            {
                this.Dispatcher.Invoke(() =>
                {
                    Window.GetWindow(this).IsEnabled = true;
                });
            }
        });
    }

预期结果

enter image description here