2010-05-17 72 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,因爲您可以多次嵌套容器。

我認爲這個想法還有一些問題要解決,但它應該給你一個好的方向。

相關問題