好吧,所以这是(希望)一个非常简单的解决方案,但我试图创建一个允许外部访问标签的通用方法,现在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;
}
}
有没有这样做的方法?我一直在寻找,但它似乎没有在任何地方得到解答。
答案 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);
});
}
}