代码之家  ›  专栏  ›  技术社区  ›  Don

2个或多个控件只有1个被认为是活动的

  •  0
  • Don  · 技术社区  · 14 年前

    我有两个控制器( MyCtrl )在对方旁边打电话 ctrlLeft ctrlRight .

    当一个人接收到交互时,它被认为是活动的(默认情况下,左边的那个)。我重写了OnDraw并对活动的外观进行了一点自定义。

    目前我有一个财产 Active 以及我从所有人那里订阅的活动 MycTrl 在这里,我存储了对活动的引用,如下所示:

    if (sender is MyCtrl) 
    {
        ctrlActive = (sender as MyCtrl);
        ctrlLeft.Active = !(ctrlRight.Active = (ctrlActive == ctrlRight));
    }
    

    不管怎样我都需要 ctrlActive 因为我把它用于其他事情,但我想知道的是,这是否是让他们了解彼此的最佳方式?

    我想到的另一个选择是存储对每个可能的myctrl的引用,然后遍历em all并激活/停用与发送者匹配的引用,以防将来添加 ctrlMiddle .

    我的想法错了吗,还有更好的选择吗?例如,RadioButton如何完成其类似功能?

    编辑:谢谢所有的建议。

    在我的特殊情况下,我不需要一个容器,即使我有3个 MycTrl 只有一个仍可以激活,我不希望它们“链接”2和2,因此我使用 public static MyCtrl { get; set; } 每个控件都可以对其进行自我检查,并且可以在需要的地方对其进行更新,这在我的示例中有效,并且消除了在使用多个控件时通过集合循环的需要 MycTrl .

    3 回复  |  直到 14 年前
        1
  •  1
  •   Rusty    14 年前

    你的方法是合理的。如果您只需要一个激活的多个控件,请考虑一个容器(可视或其他),其中子容器向容器提供“activate”事件,子容器也订阅容器中的“control activated”事件……如果子容器不是容器“control activated”事件提供的控件,则将其绘制为不活动,否则将绘制为活动。

        2
  •  0
  •   Maurizio Reginelli    14 年前

    你必须自己管理激活,所以我认为你的方法是好的。

        3
  •  0
  •   Oliver    14 年前

    我几乎和拉斯蒂有同样的想法。但我会让它更一般一点。

    为什么不构建包含两个面板的容器控件(如SplitContainer)。容器控件具有类型为的活动属性 enum ActivePanel { First, Second } 它可以由setter从外部切换,也可以通过订阅容器自动切换到 Focus 事件(或类似事件)。

    通过这种方法,你也不需要 ctrlMiddle 因为您可以多次嵌套容器。

    我认为这个想法还有一些问题要解决,但它应该给你一个好的方向。