我在 C# 中有以下类:
public class LeapEventListener : Listener
{
public override void OnFrame(Controller controller)
{
Console.WriteLine("New Frame");
// process frame data...
}
public override void OnInit(Controller controller)
{
Console.WriteLine("Initialized");
}
public override void OnConnect(Controller controller)
{
Console.WriteLine("Connected");
//If using gestures, enable them:
controller.EnableGesture(Gesture.GestureType.TYPE_CIRCLE);
}
//Not dispatched when running in debugger
public override void OnDisconnect(Controller controller)
{
Console.WriteLine("Disconnected");
}
}
并在表单加载时调用它:
controller.AddListener(listener);
我知道从类中更改标签不是一个好主意并且违反了一些编程范例,但我如何更改标签文本而不是 Console.WriteLine ?
最佳答案
这是“良好实践”方法之一。
首先,修改你的类如下
public class LeapEventListener : Listener
{
private string status = string.Empty;
public string Status { get { return status; } }
public event EventHandler StatusChanged;
private void SetStatus(string value)
{
if (value == null) value = string.Empty;
status = value;
var handler = StatusChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public override void OnFrame(Controller controller)
{
SetStatus("New Frame");
// process frame data...
}
public override void OnInit(Controller controller)
{
SetStatus("Initialized");
}
public override void OnConnect(Controller controller)
{
SetStatus("Connected");
//If using gestures, enable them:
controller.EnableGesture(Gesture.GestureType.TYPE_CIRCLE);
}
//Not dispatched when running in debugger
public override void OnDisconnect(Controller controller)
{
SetStatus("Disconnected");
}
}
我所做的只是添加一个公共(public)只读属性、一个设置它的私有(private)方法和一个公共(public)属性更改事件。
然后只需在表单加载中添加以下行(当然是在创建 listener
之后):
yourLabel.DataBindings.Add("Text", listener, "Status");
你就完成了。
更新:根据您的评论:
(A) 如果要附加到 RichTextBox
。数据绑定(bind)仅适用于属性,因此在这种情况下,您可以简单地附加一个事件处理程序,如下所示:
listener.StatusChanged += (_sender, _e) =>
{
yourRichTextBox.AppendText(listener.Status);
};
(B) 如果从非 UI 线程调用监听器方法,则忘记数据绑定(bind),像上面那样使用事件处理程序,但方式略有不同:
Action onStatusChanged = () =>
{
// Whatever UI element you want to update
yourLabel.Text = listener.Status;
yourRichTextBox.AppendText(listener.Status);
};
listener.StatusChanged += (_sender, _e) =>
{
if (InvokeRequired)
Invoke(onStatusChanged);
else
onStatusChanged();
};
关于c# - Listener 类更改我表单上的文本标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33390018/