본문 바로가기

TechLog

실버라이트의 ButtonBase 타입

Button 타입의 부모 타입은 ButtonBase 타입이다. 실버라이트의 컨트롤 중에서는 Button 이외에도 ButtonBase 타입을 상속받고 있는 타입이 몇 개 더 있다. 다음 계층도를 살펴보자:

 

System.Object 
 
System.Windows.DependencyObject
    System.Windows.UIElement
      System.Windows.FrameworkElement
        System.Windows.Controls.Control
          System.Windows.Controls.ContentControl
            System.Windows.Controls.Primitives.ButtonBase
              System.Windows.Controls.Button
              System.Windows.Controls.HyperlinkButton
              System.Windows.Controls.Primitives.RepeatButton
             
System.Windows.Controls.Primitives.ToggleButton

               
System.Windows.Controls.CheckBox
               
System.Windows.Controls.RadioButton

 

ButtonBase 타입에는 기본적으로 Click 이벤트와 ClickMode 프로퍼티가 정의되어 있으며, 클릭과 관련된 동작을 처리할 수 있도록 되어 있다. ButtonBase를 상속하고 있는 클래스들의 실제 모습은 다음과 같다:

 

 

HyperlinkButton 타입은 실버라이트 페이지(XAML) 간의 이동에 쓰이며, 이동할 페이지를 나타내는 NavigateUri 프로퍼티를 갖고 있다.

RepeatButton 타입은 사용자가 버튼을 터치하고 있으면, 터치되고 있는 동안 Click 이벤트를 계속해서 발생시킨다. ScrollBar 타입 및 Slider 타입에서 사용되며(스크롤바 끝의 화살표 버튼을 떠올려보자), 그 외의 용도로는 거의 쓰이지 않는다.

ToggleButton 타입과 CheckBox 타입은 외형상의 차이 뿐, 기능상의 차이는 없다고 봐도 좋다.

RadioButton 타입은 체크될 경우 자신을 제외한 같은 수준에 있는 RadioButton 타입 객체를 모두 체크되지 않은 상태로 만든다. RadioButton 타입을 묶기 위해서 특정 타입을 선택해야 할 필요는 없으며, 단순히 Panel 타입의 요소에 RadioButton 요소를 두 개 이상 넣으면 된다. RadioButton 타입의 GroupName 프로퍼티를 사용하면 RadioButton 요소를 여러 개의 그룹으로 묶을 수 있다.

ToggleButton과 CheckBox는 미확정(Indeterminate) 상태를 가질 수 있다. (참고로, ToggleButton은 Indeterminate 상태에 대한 시각적 효과가 없다) ToggleButton과 CheckBox는 Nullable<bool> 타입의 IsChecked 프로퍼티를 사용하여 자신이 체크되었는지를 판단할 수 있다. IsChecked 프로퍼티는 true, false, null 값을 가질 수 있다.

XAML 코드에서 null 값을 사용하려면 다음과 같이 기술한다:

IsChecked="{x:Null}"

프로그램 코드에서 IsChecked 프로퍼티를 사용할 경우, IsChecked.Value의 값을 사용하거나 bool 타입으로 캐스팅한 다음에 사용해야 한다.

ToggleButton 타입과 CheckBox 타입은 Checked, Unchecked, Indeterminate 이벤트를 정의하고 있다. Checked 이벤트는 버튼이 체크될 때 발생하며, Unchecked 이벤트는 버튼의 체크가 지워졌을 때 발생한다. Indeterminate 이벤트 또한 버튼이 미확정 상태가 되었을 때 발생한다. Checked, Unchecked, Indeterminate 이벤트는 그때그때 별도로 발생하기는 하지만, 보통 하나의 핸들러 메서드를 정의하여 이들 세 가지 이벤트를 모두 핸들링한다.