2010-05-17 57 views
0

我有两个控件(MyCtrl)彼此相邻,名为ctrlLeftctrlRight2个或更多控件只有1个被认为是有效的

无论何时只要有人接受互动,它就被认为是有效的(默认情况下是左边的)。我重写OnDraw并自定义活动的外观。

目前,我有一个属性Active和事件,我订阅的所有MyCtrl在那里我存储到活动一个像这样的引用:

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

无论哪种方式,我需要有ctrlActive因为我用它用于其他的事情,但我想知道的是,如果这是最好的方式让他们知道对方?

我想到的另一个选择是存储对每个可能的MyCtrl的引用,然后遍历em全部并激活/禁用与发件人相匹配的一个,以防万一我将来添加ctrlMiddle

我的想法是否错误,是否有更好的选择来做到这一点。例如,单选按钮如何实现类似的功能?

编辑:谢谢你的所有建议。

在我的特殊情况下,我不想/需要一个容器,即使我有3 MyCtrl只有一个仍然可以活动,我不希望它们被“连接”2和2,所以我去了一个public static MyCtrl { get; set; }每个控件都可以检查自己,我可以更新它在我需要的地方,在我的情况下工作,并摆脱使用多个MyCtrl时需要循环收集的需求。

+0

谁引发了这个事件? – anchandra 2010-05-17 21:34:56

+0

@anchandra当自身或其中一个子控件接收到任何有资格激活它的交互时,MyCtrl触发该事件。 – Don 2010-05-18 06:39:20

回答

1

你的方法是健全的。如果您需要多个控件(只有一个控件处于活动状态),请考虑一个容器(视觉或其他方式),其中的孩子向容器提供“激活”事件,并且孩子还从容器中订阅“控件激活”事件.... if孩子不是由容器“控制激活”事件提供的控件。然后将其绘制为不活动,否则绘制为活动状态。

0

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

0

我几乎和Rusty有相同的想法。但我会让它更一般一点。

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

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

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

相关问题