【问题标题】:C# winforms: Is my separation of GUI and logic done correctly?C# winforms:我的 GUI 和逻辑分离是否正确完成?
【发布时间】:2009-05-20 00:48:03
【问题描述】:

编辑

根据以下发送逻辑代码 GUI 委托的建议,我想出了这样的代码:

Action ClearFunction = new Action(()=>Invoke(new Action(delegate() { ResultsBox.Clear(); } ) ));

可以缩短吗?


这是我的 C# windows 窗体程序的一部分。

当我开始将代码转换为使用另一个线程时,我开始感觉非常笨拙,因为我生成了线程并创建了封装在委托中的公共方法,因此逻辑代码实际上可以使用 GUI。

请就更好的习语或架构改进提出建议。谢谢。

    // form1.cs
    public void ClearResultsBox()
    {
        ResultsBox.Clear();
    }

    public void PrintResults(string s)
    {
        ResultsBox.AppendText(s);
    }

    private void SearchButton_Click(object sender, EventArgs e)
    {
        var t = new Thread(() => SearchCore.Execute(DirectoryBox.Text, SearchBox.Text, this));
        t.Start();
    }

   // logic.cs
class SearchCore
{
    delegate void ClearFunction();
    delegate void AppendFunction(string a);

    static ClearFunction clear;
    static AppendFunction print;

    public static void Execute(string path, string searchterm, MainForm form)
    {
        clear = new ClearFunction(() => form.Invoke(new ClearFunction(form.ClearResultsBox)));
        print = new AppendFunction(s => form.Invoke(new AppendFunction(form.PrintResults), s));

        clear();  

【问题讨论】:

  • @senfo 没有更多的东西。 Execute 是一个长时间运行的方法(2 分钟以上),每隔几秒输出一次。
  • 您能否提供更多关于您想要完成的任务的详细信息?你有一些相当大的设计缺陷,但我不想把你引向错误的方向,直到我明白你想去哪里。例如,您是否只是想保持 UI 响应式?
  • 对不起,我删除了我的评论以添加到它。

标签: c# .net winforms user-interface


【解决方案1】:

我不会在表单和 searchCore 之间有循环引用。 为什么不通过回调使搜索逻辑与表单对话呢?这样搜索就不需要知道表单并且更容易测试。

【讨论】:

  • 如何让搜索逻辑通过回调进行回话?这不是我在用 form.Invoke 做的吗?
  • 我同意阿里的观点。我会尝试在您的应用程序中分离功能,以便 SearchCore 类不处理 UI 或至少不处理 form1 上的 UI 元素。不是将 Form 参数传递给 Execute 方法,而是传递一个可以在搜索完成后调用的委托,并允许 Form1 类执行所需的任何 UI 操作。
  • 将委托给这两个函数作为参数传递到您的 SearchCore 中,并在您的 GUI 中使用 += 向它们注册。然后你可以从你的搜索中调用代表。
  • @Ali,我应该把代表声明放在哪里?另外,使用 += 注册是什么意思。
  • 列表框的清理是一个gui问题,搜索核心不应该关心。搜索核心应该得到一个 Action 类型的参数: public static void Execute(string path, string searchterm, Action addResult ) 并且应该调用它: addResult(result);在表单中,您有一个方法 AppendText(string searchResult) 并将其作为参数传递给搜索。忽略 +=,你不需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2015-05-28
  • 2015-06-16
  • 2011-03-09
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多