基于C#Web的WPF-Popup IsOpen不起作用

本文关键字:IsOpen 不起作用 WPF-Popup C#Web 基于 | 更新日期: 2023-09-27 18:00:33

我已经在StackOverflow和谷歌上搜索了一段时间,寻找这个问题的答案,但似乎没有一个答案能回答这个问题。。

我有一个弹出窗口。我只想让它显示"请稍候…",做一些代码,走开。没有有趣的东西,只是简单。

这是xaml:

<Canvas Margin="0,0,0,0">
        <Popup Name="dialogPopUp" StaysOpen="True" Placement="Center" Width="450">
            <Border>
                <Border.Background>
                    <LinearGradientBrush>
                        <GradientStop Color="AliceBlue" Offset="1"></GradientStop>
                        <GradientStop Color="LightBlue" Offset="0"></GradientStop>
                    </LinearGradientBrush>
                </Border.Background>
                <StackPanel Margin="5" Background="White">
                    <TextBlock FontFamily="Segoe UI" FontSize="16" Margin="10" TextWrapping="Wrap">Please wait for confirmation...
                    </TextBlock>
                 </StackPanel>
            </Border>
        </Popup>
... Rest of window xaml

我的代码:

dialogPopUp.IsOpen = true;
_Manager.DoWork();
dialogPopUp.IsOpen = false;
MessageBox.Show(_Manager.Report(), "Report");

这就是奇怪的地方。如果我放置对话框。Popup.IsOpen=false;在MessageBox之后,(只是为了测试DoWork不是即时的——尽管我知道它不是)当MessageBox打开时,弹出窗口是打开的。DoWork之前没有。

它拒绝在DoWork之前打开。若我删除DoWork并放入Thread.Sleep(2000),同样的问题。弹出窗口直到睡眠之后才可见,即使该语句是在睡眠之前。

如果我去掉所有东西,只做一个长时间的循环,什么都没有。弹出窗口拒绝打开,直到循环结束。

有什么想法吗?

编辑:添加:经过一些调试后,直到函数退出(当我删除MessageBox.Show时),它才会变得可见。

IE:

DoWorkClicked()
{
    dialogPopup.IsOpen = true;
    DoWork()
    ...
} 
 // popup opens here

带MessageBox:

DoWorkClicked()
{
    dialogPopup.IsOpen = true;
    DoWork()
    MessageBox.BlahBlahBlah  // Popup opens here
    ...
} 

答案编辑:狄奥多西·冯·里希特霍芬回答了我的问题。添加了BackgroundWorker:

BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += backgroundWorker_DoWork;
backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
...
DoWorkClicked()
{
    dialogPopUp.IsOpen = true;
    backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork (object sender, DoWorkEventArgs e)
{
      this.DoWork();
      backgroundWorker.ReportProgress(100)
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEvenetArgs e)
{
    dialogPopUp.IsOpen = false;
}

基于C#Web的WPF-Popup IsOpen不起作用

我相信您将需要使用BackgroundWorker或类似的DoWork(较新版本的.NET有一些新选项Async/await等),这可能都在UI线程上。这会让UI在工作完成之前更新,实际上你是在显示,然后不显示,直到所有这些都完成后才更新。您正在使用什么.NET Framework?下面是一个例子,请参阅已接受的答案。。。

如何使用ProgressBar更新正确实现BackgroundWorker?

使用Async/Await 时的WPF ProgressBar用法

超简单的.NET 4.5示例:

private async void Button_Click(object sender, RoutedEventArgs e)
        {
            this.dialogPopUp.IsOpen = true;
            await Task.Run(() => DoWork());
            this.dialogPopUp.IsOpen = false;
        }
        private void DoWork()
        {
            Thread.Sleep(5000);
        }