C# progress bar change color

2020-03-12 03:27发布

问题:

I am trying to change the color of my progress bar, I'm using it as a password strength validator. For example, if the desired password is weak, the progress bar will turn yellow, if medium, then green. Strong, orange. Very strong, red. It's just something like that. Here's my code for the password strength validator:

using System.Text.RegularExpressions;
using System.Drawing;
using System.Drawing.Drawing2D;

var PassChar = txtPass.Text;

        if (txtPass.Text.Length < 4)
        pgbPass.ForeColor = Color.White;
        if (txtPass.Text.Length >= 6)
        pgbPass.ForeColor = Color.Yellow;
        if (txtPass.Text.Length >= 12)
        pgbPass.ForeColor = Color.YellowGreen;
        if (Regex.IsMatch(PassChar, @"\d+"))
        pgbPass.ForeColor = Color.Green;
        if (Regex.IsMatch(PassChar, @"[a-z]") && Regex.IsMatch(PassChar, @"[A-Z]"))
        pgbPass.ForeColor = Color.Orange;
        if (Regex.IsMatch(PassChar, @"[!@#\$%\^&\*\?_~\-\(\);\.\+:]+"))
        pgbPass.ForeColor = Color.Red;

The pgbPass.ForeColor = Color.ColorHere doesn't seem to be working. Any help? Thanks.

回答1:

The Progress Bar Color cannot be changed in c# unless the the Visual Styles are Disabled.Although the IDE Offers to change the Color you will observe no color change as the progress bar will take up the visual style of the current operating system.You can opt to disable the visual style for your whole application.To do this go to the starting class of the program and remove this line from the code

 Application.EnableVisualStyles();

or use some custom progress bar control like this http://www.codeproject.com/KB/cpp/colorprogressbar.aspx



回答2:

Find and remove Application.EnableVisualStyles(); from your aplication.

you can find many examples from here



回答3:

Red tends to indicate errors or troubles -- please reconsider using red to indicate "strong password".

Also, because you're updating the color many many times based on potentially many matches, your colors won't be as consistent as you'd like.

Instead, give each of the conditions a score, and then choose your color based on the total score:

    int score = 0;

    if (txtPass.Text.Length < 4)
        score += 1;
    if (txtPass.Text.Length >= 6)
        score += 4;
    if (txtPass.Text.Length >= 12)
        score += 5;
    if (Regex.IsMatch(PassChar, @"[a-z]") && Regex.IsMatch(PassChar, @"[A-Z]"))
        score += 2;
    if (Regex.IsMatch(PassChar, @"[!@#\$%\^&\*\?_~\-\(\);\.\+:]+"))
        score += 3;

    if (score < 2) {
       color = Color.Red;
    } else if (score < 6) {
       color = Color.Yellow;
    } else if (score < 12) {
       color = Color.YellowGreen;
    } else {
       color = Color.Green;
    }

Note the use of an else-if construct that is sometimes easier than language-supplied switch or case statement. (The C/C++ one in particular is prone to buggy software.)