如何使用Winform C#4.5在任务栏中显示进度

Spa*_*rfy 5 c# taskbar winforms

编辑:我不希望它更新,更改或消失.我希望任务栏达到40%才能启动程序,保持这种状态直到它关闭.

我花了很多时间尝试了许多例子......但没有运气.

为了简单起见,如何在Error颜色中显示40%?

此代码运行但在屏幕上不执行任何操作,没有错误,只需运行:

public TaskbarItemInfo taskBar = new TaskbarItemInfo();
Run Code Online (Sandbox Code Playgroud)

然后在一个方法中:

taskBar.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Error;
taskBar.ProgressValue = 0.40;
Run Code Online (Sandbox Code Playgroud)

如果您在下一行断点并查看,它已设置值,它们只是不在屏幕上执行任何操作...

Pet*_*iho 6

TaskbarItemInfo什么都不做.它需要一个在任务栏上显示的窗口.请注意,通常TaskbarItemInfo从WPF的实例获取实例Window.即该类旨在用于WPF程序,而不是Winforms.

对于Winforms程序,您可能会发现使用Windows API Codepack更为实际,如果我没记错的话,它会支持这个Shell功能.

您可以使用TaskbarManagerWindowsAPICodePack.Taskbar来设置窗体窗口的任务栏进度,如下所示:

using Microsoft.WindowsAPICodePack.Taskbar;
...
private void Form1_Load(object sender, EventArgs e)
{
    TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Error, Handle);
    TaskbarManager.Instance.SetProgressValue(40, 100, Handle);
}
Run Code Online (Sandbox Code Playgroud)

使用当前表单.Handle告诉经理应该提供此功能的窗口.如果您希望在同一位置处理其进度,也可以使用来自其他表单的公共静态指针引用.

不幸的是,由于某些原因,微软不再为此托管下载,尽管该库仍然具有相关性.但这里有一个StackOverflow Q&A,其中有许多其他链接用于同一个库:Windows API Code Pack:它在哪里?.请注意,有两个版本,1.0和1.1.一般来说,你可能更喜欢1.1版本; 它有许多错误修复,增加的功能,以及更好的Fxcop合规性.我提供的链接是针对1.1的,但也有关于在该SO文章上下载1.0的链接.


Loa*_*ing 5

这是一个简短的示例,您应该能够使用它来满足您的需求:

    System.Windows.Window w = new System.Windows.Window();
    w.TaskbarItemInfo = new System.Windows.Shell.TaskbarItemInfo() { ProgressState = System.Windows.Shell.TaskbarItemProgressState.Normal };
    w.Loaded += delegate {
        Action<Object> callUpdateProgress = (o) => {
            w.TaskbarItemInfo.ProgressValue = (double) o;
        };

        Thread t = new Thread(() => {
            for (int i = 1; i <= 10; i++) {
                w.Dispatcher.BeginInvoke(callUpdateProgress, 1.0 * i / 10);
                Thread.Sleep(1000);
            }
        });
        t.Start();
    };

    System.Windows.Application app = new System.Windows.Application();
    app.Run(w);
Run Code Online (Sandbox Code Playgroud)

要完成上述工作,您需要using System.Threading;在顶部并添加以下引用:PresentationCore, PresentationFramework, SystemXaml, WindowsBase

  • 请注意,这不适用于常规的 Windows 窗体 (7认同)
  • 感谢 Loathing 提出这个问题。感谢 Faljbour 的所有努力。要完成上述工作,您需要“使用 System.Threading;” 在顶部并添加以下引用:PresentationCore、PresentationFramework、SystemXaml、WindowsBase。 (3认同)