GUI框架模式?

7
我们正在开发嵌入式环境,并需要创建自己的UI框架。
我之前做过这个,但我对常见框架设计模式进行了一些研究。
我认为以下是一些模式(有些比较广泛):
-小部件焦点/失焦 -小部件动画 -元素之间的数据共享 -将命令附加到小部件 -保存状态(MVC?)
您有哪些关于GUI框架模式的推荐阅读材料?
6个回答

5
我有两种方法可以为您提供帮助,回调或通知。也许这就是您所说的“将命令附加到小部件”,在某种程度上,您希望对UI元素中状态的更改做出反应。控制器需要被告知发生了更改。
Cocoa/UIKit采用称为“代理”和通知的模式来实现此功能,其他使用回调函数或对象(Java Swing)或“信号和槽”(QT)。
非常有用但并不经常出现的模式是能够“防止”状态更改,最简单的用例是输入验证,当小部件中的文本与您期望的内容不符时,您想要防止小部件失去焦点。Windows Forms在某些元素上曾经拥有该功能,但并非所有元素都具备该功能,Cocoa可以实现此功能。可以通过在回调中使用返回值或引用参数(或指针)来实现,被调用方可以与源小部件进行通信。
现在,将样式应用于UI元素,即在不改变功能的情况下更改外观已变得非常流行。QT可以做到这一点,我相信许多其他库也可以。
有时还会使用四人帮装饰器模式来增强小部件的功能,例如,可以通过装饰器使其可滚动。这完全取决于您需要为UI元素走多远。祝您好运,这不是一项容易的任务。
EDT:在任何可以的地方应用MVC模式。首选候选人是任何类型的列表显示,不要使它们负责保持它们正在显示的项目。这肯定适用于组合框、列表框、表格和树形图,您也可以为文本输入实现此功能,但可能不值得开销。

4

关于经典设计模式的一些要点;我认为这些与GUI构建有关:

  • MVC模式 显然。
  • 观察者模式;例如,视图需要观察模型(以了解其状态何时更改),而控制器需要观察视图(以了解按钮何时被点击)。
  • 策略模式;在某种程度上,使用控制器作为View和Model之间的粘合剂就是选择一个策略。理论上,您应该能够透明地切换控制器。
  • 组合模式;您的视图就像是窗格、小部件等的树形结构。拥有一个公共接口和一种迭代此集合的方法在需要调用类似于“view.paint()”的内容时非常有用。

我知道你询问的是框架的模式,但仍然应该依赖这些模式,因为开发人员可能会考虑这些概念来使用您的框架。

您的框架是否有要求/特定需求?如果您的目标平台在内存/CPU方面受限,您可能需要放弃一些“好原则”。


3

职责链模式。

在GUI上下文中的示例:

interface IWidget
{
    bool HandleEvent(Event event); // returns true if event was handled
                                   // or false if event was ignored
}

class Button : IWidget
{
    public override bool HandleEvent(Event event)
    {
        switch(event.Type)
        {
            case EventType.MousePressed: DoStuff(); return true;
            case EventType.MouseScrolled: return false;
        }
    }
}

在这里,按钮不关心滚动事件,所以它们让它们的父级(即指挥链)处理。因此,如果您在HTML页面中有一个按钮,并且用户在按钮上滚动,这将由父部件(HTML视图)处理,整个页面会滚动。
有关Qt框架中实际使用的示例,请参见bool QWidget :: event(QEvent *)事件过滤器文档
另请参见: KDE中的设计模式。KDE是一组跨平台的开源面向对象的C ++库和软件,作为Linux桌面环境非常流行。这些是来自2003年KDE会议的幻灯片。

3

通过参与SingStar PS3的开发,我学到了一些东西

  • 将组件逻辑(如何工作)和视觉逻辑(如何呈现图像)分开是有帮助的。当你想出一种全新的渲染方式并且它能够透明地与旧的按钮控件一起使用时,这尤其好用。
  • 设置一种灵活的方式来绑定应用程序中的数据源到一个充满组件的页面,这样相同的组件就可以在一个页面上显示所有歌曲或在另一个页面上显示所有照片。这就是MVC在SingStar中的应用。
  • 事件分发/接收模型(即订阅按钮的点击)是将页面布局绑定到您的代码的一种很好的方式。如果不小心处理,它可能会变得混乱。
  • 不要发明另一种编程语言来描述您的逻辑,您当前的编程语言可能已经足够好了。
  • 考虑从一个页面切换到另一个页面的步骤。这在很大程度上取决于您的内存使用情况,但可能会出现两个页面都被加载或没有页面被加载的时刻。在此处考虑页面间通信。
  • 以数据驱动页面布局。允许热交换布局(按键从PC重新加载)因为您会经常迭代它。

2

1

学习XAML,特别是绑定。

微软在干净的XML语言上做了一项非常出色的工作,用于描述GUI布局,如果您使用简化版本的XAML来描述UI,您将能够使用他们的设计工具来模拟UI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接