Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
外部更新的Winforms的最佳实践_Winforms_Labels - Fatal编程技术网

外部更新的Winforms的最佳实践

外部更新的Winforms的最佳实践,winforms,labels,Winforms,Labels,我想知道公开标签是否是一个好主意,这样其他类就可以更改标签并获得它们的价值。这是个好主意吗?如果没有,那么应该怎么做呢?我不会公开这个标签 最好添加一个特定于标签显示内容的公共方法,并让它更新标签 例如,如果您的标签是“系统状态”标签,您可能希望添加(到表单/用户控件): 这允许您以后更改此信息的显示方式(如果您想使用其他控件),并且还简化了API,因为用户非常清楚公共方法。我不会公开标签 最好添加一个特定于标签显示内容的公共方法,并让它更新标签 例如,如果您的标签是“系统状态”标签,您可能希望

我想知道公开标签是否是一个好主意,这样其他类就可以更改标签并获得它们的价值。这是个好主意吗?如果没有,那么应该怎么做呢?

我不会公开这个标签

最好添加一个特定于标签显示内容的公共方法,并让它更新标签

例如,如果您的标签是“系统状态”标签,您可能希望添加(到表单/用户控件):


这允许您以后更改此信息的显示方式(如果您想使用其他控件),并且还简化了API,因为用户非常清楚公共方法。

我不会公开标签

最好添加一个特定于标签显示内容的公共方法,并让它更新标签

例如,如果您的标签是“系统状态”标签,您可能希望添加(到表单/用户控件):


这允许您在以后更改此信息的显示方式(如果您想使用其他控件),并且还简化了API,因为用户非常清楚公共方法。

这是个坏主意。WinForms留下了许多“做X的最佳方式是什么?”的问题;最好的答案是遵循既定的模式和实践(不是WinForms特有的)

阅读MVP或MVC模式。它们都是高级模式,专注于从业务逻辑中分离出特定于UI的代码。如果没有这种分离,您的应用程序很快就会成为维护的噩梦,本来应该简单的事情会变得复杂得多


对于您的特定场景,您可能会得到一个模型(您的业务逻辑),该模型使用数据绑定在WinForms屏幕上显示其数据。当UI上发生更改时,接收更改的将是模型,该更改将通过数据绑定传播到UI。

这是个坏主意。WinForms留下了许多“做X的最佳方式是什么?”的问题;最好的答案是遵循既定的模式和实践(不是WinForms特有的)

阅读MVP或MVC模式。它们都是高级模式,专注于从业务逻辑中分离出特定于UI的代码。如果没有这种分离,您的应用程序很快就会成为维护的噩梦,本来应该简单的事情会变得复杂得多


对于您的特定场景,您可能会得到一个模型(您的业务逻辑),该模型使用数据绑定在WinForms屏幕上显示其数据。当UI上发生更改时,接收更改的将是模型,并且该更改将通过数据绑定传播到UI。

我建议包装在setter属性或方法中,因为如果调用方来自另一个属性或方法,您很可能必须添加日志记录或重新调用window的主线程。我发现,在公开允许客户端更新任何图形化内容的功能时,总是使用如下代码更容易

public void SetStart()
    {
        if (this.InvokeRequired)
        {
            this.Invoke((MethodInvoker)delegate()
            {
                this.SetStart();
            });
        }
        else
        {
            progressBar1.Value = 0;
            progressBar1.Visible = true;
        }
    }

我建议使用setter属性或方法进行包装,因为如果调用方来自另一个,则很可能需要添加日志记录或重新调用窗口的主线程。我发现,在公开允许客户端更新任何图形化内容的功能时,总是使用如下代码更容易

public void SetStart()
    {
        if (this.InvokeRequired)
        {
            this.Invoke((MethodInvoker)delegate()
            {
                this.SetStart();
            });
        }
        else
        {
            progressBar1.Value = 0;
            progressBar1.Visible = true;
        }
    }

如果不是,请向窗体中添加属性。如果不是,请向窗体中添加属性。获取如何,这是否可以在一个函数中实现?只有当另一个线程中有代码尝试调用某些更改winforms窗口外观的内容时,才会出现问题。您将知道它何时发生,因为会引发异常。据我所知,获取数据不需要安全防护。获取如何,这可能在一个函数中吗?只有当您在另一个线程中有代码尝试调用某个更改winforms窗口外观的东西时,才会出现问题。您将知道它何时发生,因为会引发异常。据我所知,获取数据并不需要安全警卫。