如何调用状态条中的进度条
本文关键字:状态 何调用 调用 | 更新日期: 2023-09-27 18:00:43
我正在使用以下代码来调用应用程序中主UI线程上的控件。我的状态条带中的进度条没有InvokeRequired,我需要以某种方式调用System.Windows.Forms.ToolStripProgressBar.
if (txtbox1.InvokeRequired)
{
txtbox1.Invoke(new MethodInvoker(delegate { txtbox1.Text = string.Empty; }));
}
尝试
if (toolStripProgressBar1.Parent.InvokeRequired)
{
toolStripProgressBar1.Parent.Invoke(new MethodInvoker(delegate { toolStripProgressBar1.Value= 100; }));
}
尝试使用这个方便的扩展方法:
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);
它安全地调用UI线程上的操作,并且可以从任何实际控件中调用。
尝试调用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..
}
}
"this"应该是它自身的形式。
您可以从Automaticing the InvokeRequired代码模式更改通用调用程序,该代码模式旨在调用任何Control:
//Neat generic trick to invoke anything on a windows form control class
//https://stackoverflow.com/questions/2367718/automating-the-invokerequired-code-pattern
//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);
}
}