我有2个控件(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
。
我的想法是错的,有没有更好的选择来做到这一点。例如,radiobuttons如何实现其类似功能?
编辑:感谢所有建议。
在我的特定情况下,我不想/需要一个容器,即使我有3 MyCtrl
只有一个仍然可以活动,我不希望它们被“链接”2和2所以我与public static MyCtrl { get; set; }
一起使用,每个控件都可以自我检查,我可以在需要的地方更新它,这在我的情况下有效,并且在使用多个MyCtrl
时需要循环访问集合。
答案 0 :(得分:1)
你的方法很健全。如果您需要多个控件,只有一个处于活动状态,请考虑容器(可视或其他),其中子容器向容器提供“激活”事件,子容器也从容器中订阅“控制激活”事件....容器“控制激活”事件所提供的控件不是该控件。然后将其漆成不活动状态,否则将其作为活动状态。
答案 1 :(得分:0)
你必须自己管理激活,所以我认为你的方法很好。
答案 2 :(得分:0)
我几乎和Rusty有同样的想法。但我会更加一般。
为什么不构建包含两个面板的容器控件(如SplitContainer)。容器控件具有类型为enum ActivePanel { First, Second }
的Active属性,可以通过setter从外部切换,也可以通过容器的订阅自动切换到Focus
事件(或类似的东西)。
使用这种方法,您也不需要ctrlMiddle
因为您可以多次嵌套容器。
我认为这个想法还有一些问题要解决,但它应该给你一个好的方向。