2010-05-17 3 views
0

ctrlLeftctrlRight이라는 컨트롤이 두 개 있습니다 (MyCtrl).2 개 이상 컨트롤 1 개만 활성으로 간주됩니다.

상호 작용을받을 때마다 활성이라고 간주됩니다 (기본적으로 왼쪽). OnDraw를 재정의하고 활성화 된 모양을 약간 사용자 정의합니다.

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

내가 사용으로 ctrlActive이 필요 어느 쪽이든 : 현재

나는이 같은 활성 하나에 대한 참조를 저장 내가 거기에있는 모든 MyCtrl에서 가입 속성 Active 및 이벤트를 다른 것들을 위해서지만, 이것이 내가 서로를 깨닫게하는 가장 좋은 방법인지 궁금합니다.

내가 생각한 또 다른 옵션은 가능한 모든 MyCtrl에 대한 참조를 저장 한 다음 em 전체를 반복하고 나중에 일치하는 발신자와 일치하는 것을 활성화/비활성화하는 것입니다. ctrlMiddle을 추가하십시오.

내 생각이 잘못 되었나요? 더 좋은 방법이 있습니까? 예를 들어, 라디오 버튼은 비슷한 기능을 어떻게 수행합니까?

편집 : 모든 제안 주셔서 감사합니다.

내 특별한 경우에는 3을 가지고 있어도 컨테이너를 필요로하지 않거나 필요로하지 않습니다. MyCtrl 하나만 활성화되어 있고 2와 2로 연결되는 것을 원하지 않습니다. public static MyCtrl { get; set; } 각 컨트롤에 대해 자신을 확인할 수 있고 필자가 필요로하는 곳에서 업데이트 할 수 있으며 여러 개의 MyCtrl을 사용할 때 콜렉션을 반복 할 필요가 없다.

+0

누가 이벤트를 시작합니까? – anchandra

+0

@anchandra MyCtrl은 자체 또는 하위 컨트롤 중 하나가 해당 하위 컨트롤을 활성화 할 수있는 상호 작용을 받으면 이벤트를 시작합니다. – Don

답변

1

귀하의 방법은 정상입니다. 하나만 활성화 된 상태에서 여러 컨트롤이 필요한 경우 컨테이너가 컨테이너에 "활성화"이벤트를 제공하고 컨테이너가 컨테이너에서 "컨트롤 활성화"이벤트를 구독하는 컨테이너 (시각적 또는 기타)를 고려하십시오. if 그 아이는 컨테이너 "컨트롤 활성화"이벤트에 의해 제공되는 컨트롤이 아닙니다. 그런 다음 활성 상태가 아닌 것으로 페인트합니다. 그렇지 않으면 활성 상태로 페인트합니다.

0

직접 활성화를 관리해야하므로 내 방법이 훌륭하다고 생각합니다.

0

나는 Rusty와 거의 같은 아이디어를 가지고 있었다. 하지만 좀 더 일반적인 것으로 만들 것입니다.

두 패널 (예 : SplitContainer)이 포함 된 컨테이너 컨트롤을 작성하지 않는 이유는 무엇입니까? 컨테이너 컨트롤은 enum ActivePanel { First, Second } 유형의 활성 속성을 가지며 설정자가 외부에서 전환하거나 Focus 이벤트 (또는 비슷한 이벤트)에 대한 컨테이너 구독을 통해 자동으로 전환 할 수 있습니다.

이러한 접근 방식을 사용하면 컨테이너를 여러 번 중첩시킬 수 있으므로 ctrlMiddle이 필요하지 않습니다.

나는이 아이디어로 해결해야 할 몇 가지 문제가 있다고 생각하지만 좋은 방향을 제시해야합니다.

관련 문제