处理每个app状态的GUI元素属性

时间:2008-12-03 16:22:12

标签: c# winforms user-interface

我正在考虑通过使用一个传递AppState参数的方法来集中此功能,并且它处理基于此参数更改所有GUI元素的属性。每次应用程序更改其状态(准备就绪,忙碌,下载如此部分忙碌等)时,将使用适当的状态调用此函数(或者可能是某个字段或其他内容)并且它会发挥其魔力。

如果我分散改变整个地方的GUI元素的状态,那么很容易忘记当应用程序处于某种状态时,那里的其他小部件也需要被禁用,等等。

还有其他方法来处理这类事情吗?

3 个答案:

答案 0 :(得分:1)

埃默拉尔,

你的想法很好。您需要限制状态结构,这是确保可靠UI的唯一方法。另一方面,不要严格遵循“一个功能”的想法。而是继续遵循其方向,通过创建一个函数,然后逐步将所有属性重构为单个“setter”函数。你需要记住一些事情:

  1. 仅使用单向通信。不要从控制中读取状态,因为这是所有邪恶的根源。首先限制属性读取的数量,然后限制属性写入的数量。

  2. 您需要采用一些缓存方法。确保缓存不会将属性读取注入主代码。

  3. 单独保留对话框,只需确保所有对话框通信在打开和关闭期间完成,而不是在两者之间(尽可能多)。

  4. 在最常用的控件上实现包装器,以确保严格的通信框架。不要创建任何全局控制框架。

  5. 除非您的用户界面非常复杂,否则请勿使用此提示。在这种情况下,使用常规的WinForms或JavaScript事件会使您获得更小的代码。

  6. 代码越少越好。除非你的线条松散,否则不要重构。

  7. 祝你好运!

答案 1 :(得分:0)

是的,这是GUI工作中最耗时的部分,用于构建用户友好的应用程序。禁用它,启用它,隐藏它,显示它。在插入/更新/删除/选择/取消选择时确保所有控件都具有正确的状态。

我认为那是你从一个坏程序员那里告诉一个好程序员的地方。一个坏的程序员有一个活动的“保存”按钮,当没有任何改变要保存时,一个优秀的程序员只有在有东西需要保存时才会启用“保存”按钮(只有很多例子)。

我为此目的喜欢UIControlstate-handler的想法。

Me.UIControlStates = UIControlstates.EditMode或类似的东西。

如果有这样的对象,它可以在状态改变时引发事件,并且我们放置代码。

Sub UIControlStates_StateChanged(sender as object, e as UIControlStateArgs)
   if e.Oldstate=UIControlStates.Edit and e.NewState=UIControlStates.Normal then
      rem Edit was aborted, reset fields
      ResetFields()
   end if
   select case e.NewState
       case UIControlStates.Edit
         Rem enalbe/disable/hide/show, whatever

       Case UIControlStates.Normal
         Rem enalbe/disable/hide/show, whatever
       Case UIControlStates.Busy
         Rem enalbe/disable/hide/show, whatever
       Case Else
         Rem enalbe/disable/hide/show, whatever
   end select
end sub

答案 2 :(得分:0)

@Stefan:

我认为我们正在思考相同的问题,即一段代码可以修改所有窗口小部件状态,而其他所有人都必须调用它来进行此类更改。除此之外,我正在描绘一个直接的方法调用,同时你正在描绘提升/捕获事件。使用事件和简单的方法调用是否有优势?