AddHandler 메서드

UIElement.AddHandler 메서드

2013-12-13

지정된 라우트된 이벤트에 대한 라우트된 이벤트 처리기를 현재 요소의 처리기 컬렉션에 추가하는 방식으로 추가합니다. handledEventsTootrue로 지정하여 이벤트 경로를 따라 다른 요소에 의해 이미 처리된 것으로 표시된 라우트된 이벤트에 대해 제공된 처리기를 호출합니다.

Namespace:  System.Windows
어셈블리:  System.Windows(System.Windows.dll)

public void AddHandler(
	RoutedEvent routedEvent,
	Delegate handler,
	bool handledEventsToo
)

매개 변수

routedEvent
형식: System.Windows.RoutedEvent
처리할 라우트된 이벤트의 식별자입니다.
handler
형식: System.Delegate
처리기 구현에 대한 참조입니다.
handledEventsToo
형식: System.Boolean
라우트된 이벤트가 해당 이벤트 데이터에서 처리된 것으로 표시된 경우에도 처리기가 호출되도록 등록하려면 true이고, 라우트된 이벤트가 이미 처리된 것으로 표시된 경우에는 호출되지 않는 기본 조건으로 처리기를 등록하려면 false입니다. 기본값은 false입니다. 라우트된 이벤트를 다시 처리할 것인지 묻는 질문을 정기적으로 표시하지 마세요. 자세한 내용은 설명 부분을 참조하세요.

예외조건
ArgumentNullException

routedEvent 또는 handlernull인 경우.

ArgumentException

routedEvent가 지원되는 라우트된 이벤트를 나타내지 않는 경우

-또는-

handler가 지원되는 대리자를 구현하지 않는 경우

NotImplementedException

현재 플랫폼 변형에서 지원하지 않는 이벤트에 대해 처리기를 추가하려고 시도한 경우

낮은 수준의 입력 이벤트를 효율적으로 처리하는 것은 복잡한 작업입니다. 대부분의 컨트롤은 특정 이벤트가 처리된 것으로 표시되며 보다 직관적인 다른 이벤트로 바뀌는 동작을 구현합니다. 일반적으로 컨트롤은 디자인을 위해 필요한 경우에만 라우트된 이벤트를 handled로 표시합니다. 그러나 이러한 디자인 필요 사항이 특정 입력 이벤트 처리에 필요한 사항과 일치하지 않는 경우도 있습니다. 이러한 경우에는 handledEventsToo가 포함된 처리기를 true로 등록하는 것이 적절합니다. 그러나 이 작업은 정기적으로 수행하지 않는 것이 좋습니다. 처리기를 처리된 이벤트를 포함한 모든 이벤트에 대한 응답으로 호출하면 응용프로그램 이벤트 처리 논리가 복잡해집니다. 그리고 처리기 논리의 양이 많아지면 성능이 떨어질 수 있습니다. 응용프로그램 및 사용자 코드 논리를 사용하여 처리하려는 이벤트를 특정 컨트롤이 처리하고 있음을 개발 프로세스 중에 이미 확인한 경우에는 이미 처리된 이벤트에만 처리기를 연결해야 합니다.

특정 이벤트-컨트롤 조합의 클래스 처리 동작을 사용하지 않는 다른 방법은 해당 컨트롤을 서브클래싱하고 On* 클래스 메서드를 재정의하는 것입니다. 이러한 메서드는 컨트롤이 이벤트를 handled로 표시하는 특정 코드 경로입니다. 그러나 이 방법도 복잡할 수 있습니다. 기준에서 이벤트를 handled로 표시하는 것일 수 있으므로 기준을 호출하지 않고 지정된 컨트롤의 처리 구현을 재현해야 할 수도 있습니다.

AddHandler를 사용하려면 라우트된 이벤트에서 routedEvent 매개 변수에 필요한 이벤트 식별자인 공용 정적 필드를 노출해야 합니다. 이는 다음과 같은 핵심 클래스의 제한된 이벤트 집합에만 해당합니다.

FrameworkElement.LoadedAddHandler를 사용하지 마세요. FrameworkElement.Loaded는 Windows Phone 구현에서 실제 라우트된 이벤트가 아닙니다. MouseMove는 이벤트 데이터에 Handled가 없으므로 AddHandler와 함께 사용할 수 없습니다. FrameworkElement.BindingValidationError는 이벤트 식별자와 이벤트를 처리하는 컨트롤이 없으므로 AddHandler와 함께 사용할 수 없습니다.

예외를 발생시키지 않고 같은 이벤트에 대해 동일한 처리기를 여러 번 추가할 수 있습니다. 그러나 이벤트가 처리될 때 처리기는 실제로 여러 번 호출됩니다. 그러므로 이 동작이 처리기 구현에서 고려해야 하는 의도하지 않은 결과를 발생시킬 수 있는지를 고려해야 합니다.

다음 예제에서는 라우트된 이벤트에 대한 처리기 구현(KeyDown)과 XAML 정의 페이지의 루트 요소에 KeyDown 처리기를 연결하는 Loaded 이벤트 처리기를 보여 줍니다. += 구문을 사용하는 대신 AddHandlerhandledEventsToo true를 사용하여 호출됩니다. 따라서 TextBox와 같은 컨트롤에 KeyDown / OnKeyDown 구현의 컨트롤별 처리가 있는 경우라도 CapsLock 키의 사용을 이벤트 라우팅을 통해 루트 요소에 보고할 수 있습니다.

    // Assumes the UI has a TextBox that can pop-up the keyboard defined as a child of LayoutRoot, and a 
    // TextBlock named textBlock1 that can display text onscreen.
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            LayoutRoot.Loaded +=new RoutedEventHandler(Load_Main);
        }

        private void Load_Main(object sender, RoutedEventArgs e)
        {
            UIElement target = sender as UIElement;
            target.AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(LayoutRoot_KeyDown), true);
        }

        private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.PlatformKeyCode == 233)
            {
                textBlock1.Text = "Caps Lock!";
            }
        }
    }


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

표시:
© 2016 Microsoft