c# - Listener 类更改我表单上的文本标签

标签 c# winforms

我在 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/

相关文章:

c# - Control.OnPaint() 在自定义控件中被调用两次

c# - 在 IIS 中删除文件时出错

c# - 在 C# 中单击时清除单个文本框?

c# - 如何根据用户角色操作 WPF GUI

c# - 发布参数始终为空

c# - 如何检查字符串是否不等于多个字符串

c# - 使用大量控件填充 FlowLayoutPanel 并按需绘制缩略图

c# - 在 C# 中读取默认应用程序设置

c# - 组合框默认值始终是 SQL 表值 - C#

c# - 拆分具有最大字符限制的字符串