- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在我的程序中创建类来启动一系列事件以在文本框中写入文本。我知道类(class)不应该知道表格。怎么做?考虑到我将在另一个线程上安装该类。
我已经尝试制作一个连接类的接口(interface),并使用 ref 参数在表单上制作方法。
*更新:*你们都误解了我——我说的是不在编程中的事件。我所需要的只是将文本添加到另一个类的文本框。我添加了“事件链”来从类似的问题中定义它,在这些问题中,他们试图直接从类里面更改文本。对不起。
最佳答案
这里有两个可能的选择:
“其他类”需要在“完成”工作后立即更新文本框。如果是这种情况,它不应该知道表单、任何文本框、界面,什么都不知道。它应该只是返回一个值,然后让表单使用该返回值来设置文本框,或做任何事情。
在大多数情况下,这是您想要做的,而且它是解决此类问题的最简单和最有效的方法。如果没有必要,不要使用更复杂的东西。
如果信息没有在任务“完成”时发生,而是通过周期性间隔发生,那么您可以使用 Progress
类与 IProgress
界面。
有Form
创建实例:Progress<string> progress = new Progress<string>();
.让表单为该实例附加一个事件处理程序。请注意 Progress
instance 将“捕获”当前同步上下文,这是一种在 UI 线程中运行的奇特说法。这可以像这样完成:
progress.ProgressChanged += (_, data) => textBox1.Text = data;
然后让其他类接受 IProgress<string>
实例并定期调用:
progress.Report(someString);
如果您需要 Progress
的 pre-4.5 实现和 IProgress
,这是一个将在 .NET 3.5+ 中编译和运行的实现:
public interface IProgress<T>
{
void Report(T data);
}
public class Progress<T> : IProgress<T>
{
SynchronizationContext context;
public Progress()
{
context = SynchronizationContext.Current
?? new SynchronizationContext();
}
public Progress(Action<T> action)
: this()
{
ProgressReported += action;
}
public event Action<T> ProgressReported;
void IProgress<T>.Report(T data)
{
var action = ProgressReported;
if (action != null)
{
context.Post(arg => action((T)arg), data);
}
}
}
关于c# - 从另一个类(在另一个线程上)写在文本框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14780899/
我是一名优秀的程序员,十分优秀!