【问题标题】:c# wpf Progress bar in different windowc# wpf进度条在不同的窗口
【发布时间】:2018-05-31 08:22:28
【问题描述】:

我想弄清楚如何在我的应用程序中使用进度条。我有一个注销表单作为主窗口。我想要一个进度条的附加窗口。在我的主窗口代码中有 15 秒的睡眠时间。我希望用户在进度条中看到进度,如果 15 秒完成,进度条需要关闭。我想知道是否有任何方法可以将进度条的代码放在我的主窗口代码中。或者也许是一种让进度条与 15 秒等待时间交互的方法。

我是编码新手,所以解释代码对我理解代码很有帮助。

提前致谢。

我在进度条窗口中的代码:

public partial class ProgressBar : Window
    {
        public ProgressBar()
        {
            InitializeComponent();
        }

        private void Window_ContentRendered(object sender, EventArgs e)
        {
            for (int i = 0; i <= 15; i++)
            {
                pbStatus.Value++;
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

我的进度条.xaml:

<Window x:Class="Sessie_Afmeld_Applicatie.ProgressBar"
         WindowStartupLocation="CenterScreen" ResizeMode="CanMinimize"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Sessie_Afmeld_Applicatie"
        mc:Ignorable="d"
        Title="Voortgang" Height="100" Width="300">
    <Grid>
        <ProgressBar Minimum="0" Maximum="150" Name="pbStatus"  Margin="25,23,37,23" Foreground="#FF13B931" ValueChanged="pbStatus_ValueChanged"   />
        <Label Content="Label" HorizontalAlignment="Left" Margin="125,66,0,0" VerticalAlignment="Top"/>
    </Grid>
</Window>

【问题讨论】:

  • 为什么会有“15 秒睡眠”?在这 15 秒内,您实际上在做什么?
  • @mm8 我正在创建一个应用程序,供用户注销他们自己挂起的 citrix 会话。我通过使用 powershell 命令来做到这一点。因为我想检查用户是否已注销,所以我需要等待 +- 15 秒,直到我从我的 powershell 命令中没有返回任何值,这意味着该用户没有剩余会话并且注销成功。
  • @Jze 感谢您提供有用的链接。我让它部分工作。我会及时通知你我的进展。
  • @mm8 我可以问你一个问题吗?我让进度条在不同的测试项目中工作。这个测试项目有一个按钮并正确运行进度条。在我的主项目中,我的进度条在不同的窗口中运行(因为它在我的主窗口中很难看)。我可以将我的测试项目的工作代码放入主窗口代码中吗?或者有什么方法可以链接进度条窗口?希望你能帮帮我。

标签: c# wpf progress-bar


【解决方案1】:

如果您希望在此期间能够与您的应用程序交互,您不能睡觉或做其他阻塞 UI 线程的事情。

您应该在后台线程上执行任何繁重且可能需要长时间运行的工作。在您的特定示例中,您可以使用 Task.Delay 方法异步等待:

public partial class ProgressBar : Window
{
    public ProgressBar()
    {
        InitializeComponent();
    }

    private async void Window_ContentRendered(object sender, EventArgs e)
    {
        for (int i = 0; i < 15; i++)
        {
            pbStatus.Value++;
            await Task.Delay(1000);
        }
        Close();
    }
}

如果您正在调用服务方法或类似方法,您可以使用任务并行库 (TPL) 并启动一个新的Task。这是一个相当大的话题。更多信息请参考 MSDN:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl

【讨论】:

  • 感谢您让我知道睡眠会阻塞 UI 线程。我确实遇到了一些关于无法与我的应用程序交互的问题。打算试试 Task.Delay 方法。
  • @Ritse:如果您的原始问题已经解决,请记住接受答案:meta.stackexchange.com/questions/5234/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多