2个或更多控件仅1被视为活动

时间:2010-05-17 21:02:01

标签: c# winforms custom-controls

我有2个控件(MyCtrl),彼此相邻,名为ctrlLeftctrlRight

每当接收到交互时,它被认为是活动的(默认情况下是左侧)。我重写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时需要循环访问集合。

3 个答案:

答案 0 :(得分:1)

你的方法很健全。如果您需要多个控件,只有一个处于活动状态,请考虑容器(可视或其他),其中子容器向容器提供“激活”事件,子容器也从容器中订阅“控制激活”事件....容器“控制激活”事件所提供的控件不是该控件。然后将其漆成不活动状态,否则将其作为活动状态。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我几乎和Rusty有同样的想法。但我会更加一般。

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

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

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