用于从外部线程更改标签文本的C#泛型方法。

时间:2016-09-16 14:52:36

标签: c# windows forms

好吧,所以这是(希望)一个非常简单的解决方案,但我试图创建一个允许外部访问标签的通用方法,现在windows文档确实为一个案例提供了一个例子

delegate void SetTextCallback(string text);
...some other code ...
private void SetText(string text)
    {
        // InvokeRequired required compares the thread ID of the
        // calling thread to the thread ID of the creating thread.
        // If these threads are different, it returns true.
        if (this.textLable.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { text });
        }
        else
        {
            this.textLable.Text = text;
        }
    }

但是我想创建一些更通用的东西,我可以沿着指针的方向传递一些东西,但是Windows窗体中的文本标签不允许这样做。理想情况下,对于这种情况,我喜欢在这些方面做某事的事情(这显然不会在形式上起作用,只是出于解释目的)

...code...
private void SetText(string text, Label* lablePointer)
{
    if (this.lablePointer.InvokeRequired)
    {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.lablePointer.Text = text;
    }
}

有没有这样做的方法?我一直在寻找,但它似乎没有在任何地方得到解答。

2 个答案:

答案 0 :(得分:3)

你不需要指针 - 你可以这样做:

private void SetText(string text, Control control)
{
    if (control.InvokeRequired)
        control.Invoke(new Action(() => control.Text = text));
    else
        control.Text = text;
}

您可以使用Control代替Label,因为Text属性是从Control继承的(Label是从Control派生的)。这使它更具一般性。

您不需要指针,因为Label(和Control)是引用类型,这意味着对Label对象的引用的副本被推送到调用SetText()时的堆栈,与在C / C ++中传递指针具有类似的效果。

(我猜你是一位正在转向C#的C / C ++程序员。)

答案 1 :(得分:0)

如果您需要在调用中执行多项操作,则可以调用整个函数来一次性完成所有操作:

export class App {
   @ViewChild('placeholder', {read: ViewContainerRef}) viewContainerRef;

  constructor(private compiler: Compiler) {}

  addItem () {
     @NgModule({declarations: [HelloComponent]})
    class DynamicModule {}

    this.compiler.compileModuleAndAllComponentsAsync(DynamicModule)
      .then(({moduleFactory, componentFactories}) => {
        const compFactory = componentFactories
           .find(x => x.componentType === HelloComponent);
        const cmpRef = this.viewContainerRef.createComponent(compFactory, 0);
      });
  }
}