【问题标题】:C# Web based WPF - Popup IsOpen not working基于 C# Web 的 WPF - Popup IsOpen 不起作用
【发布时间】:2015-06-30 05:12:45
【问题描述】:

我一直在搜索 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");

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

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

如果我删除所有内容并只执行很长的 while 循环,则什么也没有。弹出窗口拒绝打开,直到循环结束。

有什么想法吗?

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

IE:

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

带有消息框:

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

回答编辑:Theodosius Von Richthofen 回答了我的问题。添加了 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# wpf popup xbap


    【解决方案1】:

    我相信您将需要使用 BackgroundWorker 或类似的 DoWork(较新版本的 .NET 有一些新选项 Async/await 等),这可能都在 UI 线程上。这将让 UI 在工作完成之前更新,有效地显示然后不显示它,并且在完成所有操作之前它不会更新。您使用的是什么 .NET 框架?这是一个示例,请参阅接受的答案...

    How to correctly implement a BackgroundWorker with ProgressBar updates?

    WPF ProgressBar usage when using Async/Await

    超级简单的 .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);
            }
    

    【讨论】:

    • 谢谢,我试试看!哦,我正在使用 4.5
    • 干得漂亮!将编辑帖子以包含答案。
    • 很高兴能提供帮助,我第一次也不明白这一点,希望有人在我连续搜索几个小时之前告诉我
    • 在某些时候使用这个,你可能会开始遇到一些问题,比如你不能添加到集合中,不属于创建它的线程,等等等等,那时你可能开始需要使用 Dispatcher 来让某些事情正常工作...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多