Как вызвать индикатор выполнения в строке состояния? - PullRequest
5 голосов
/ 28 июня 2011

Я использую следующий код для вызова элементов управления, которые находятся в главном потоке пользовательского интерфейса в моем приложении.Индикатор выполнения, который у меня есть в моей полосе состояния, не имеет InvokeRequired, мне нужно как-то вызвать System.Windows.Forms.ToolStripProgressBar.

if (txtbox1.InvokeRequired)
{
txtbox1.Invoke(new MethodInvoker(delegate { txtbox1.Text = string.Empty; }));
}

Ответы [ 4 ]

7 голосов
/ 28 июня 2011

Попробуйте

if (toolStripProgressBar1.Parent.InvokeRequired)
{
    toolStripProgressBar1.Parent.Invoke(new MethodInvoker(delegate { toolStripProgressBar1.Value= 100; }));
}
3 голосов
/ 28 июня 2011

Попробуйте добавить этот удобный метод расширения:

public static class ControlEx
{
    public static void Invoke(this System.Windows.Forms.Control @this, Action action)
    {
        if (@this == null) throw new ArgumentNullException("@this");
        if (action == null) throw new ArgumentNullException("action");
        if (@this.InvokeRequired)
        {
            @this.Invoke(action);
        }
        else
        {
            action();
        }
    }
}

Теперь вы можете просто сделать это:

txtbox1.Invoke(() => toolStripProgressBar1.Value = value);

Он безопасно вызывает действие в потоке пользовательского интерфейса и может вызываться из любого фактического элемента управления.

2 голосов
/ 28 июня 2011

Попробуйте вызвать ToolStrip, а не ToolStripProgressBar:

    delegate void ToolStripPrograssDelegate(int value);
    private void ToolStripPrograss(int value)
    {
        if (toolStrip1.InvokeRequired)
        {
            ToolStripPrograssDelegate del = new ToolStripPrograssDelegate(ToolStripPrograss);
            toolStrip1.Invoke(del, new object[] { value });
        }
        else
        {
            toolStripProgressBar1.Value = value; // Your thingy with the progress bar..
        }
    }

Я не уверен, что это сработает, но попробуй.

Если это не сработает, попробуйте следующее:

    delegate void ToolStripPrograssDelegate(int value);
    private void ToolStripPrograss(int value)
    {
        if (this.InvokeRequired)
        {
            ToolStripPrograssDelegate del = new ToolStripPrograssDelegate(ToolStripPrograss);
            this.Invoke(del, new object[] { value });
        }
        else
        {
            toolStripProgressBar1.Value = value; // Your thingy with the progress bar..
        }
    }

«это» должно быть формой, в которой он сам.

1 голос
/ 26 ноября 2017

Вы можете изменить универсальный вызывающий элемент из Автоматизировать шаблон кода InvokeRequired , предназначенный для вызова любого Control :

//Neat generic trick to invoke anything on a windows form control class  
///2015527/avtomatizatsiya-shablona-koda-invokerequired
//Use like this:
//object1.InvokeIfRequired(c => { c.Visible = true; });
//object1.InvokeIfRequired(c => { c.Text = "ABC"; });
//object1.InvokeIfRequired(c => 
//  { 
//      c.Text = "ABC";
//      c.Visible = true; 
//  }
//);
public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
    if (c.InvokeRequired)
    {
        c.Invoke(new Action(() => action(c)));
    }
    else
    {
        action(c);
    }
}

Объекты в ToolStrip имеют значение ToolStripItem и не имеют InvokeRequired. Но родитель имеет, и выше можно переписать, чтобы использовать родитель .Invoke ():

public static void InvokeIfRequiredToolstrip<T>(this T c, Action<T> action) where T : ToolStripItem
{
    if (c.GetCurrentParent().InvokeRequired)
    {
        c.GetCurrentParent().Invoke(new Action(() => action(c)));
    }
    else
    {
        action(c);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...