2011-02-03 4 views
3

C#의 이벤트는 항상 매우 안전합니다. 이벤트의 소유자 만 트리거 할 수 있습니다. 그러나 이것은 WPF에서 완전히 다른 것 같습니다. 누구든지 언제든지 모든 이벤트를 throw 할 수 있습니다. 이를 테스트하기 위해 코드를 아래쪽에 작성했습니다.누구나 WPF에서 RoutedEvent를 발생시킬 수 있습니까?

RaiseEvent를 사용하여 Button.Click을 올렸을 때 위의 이벤트에서이를 발견했습니다. WPF 이벤트의 계획된 동작입니까? 원하는 모든 이벤트를 던지게하는 것만으로도 충분합니까? 또한 그렇다면, 당신이 이벤트를 등록 할 때 OwnerType의 의미는 무엇입니까? 나는 그것이 일종의 보호라고 생각했다. 그렇다면 누구나 공개 이벤트에 액세스하고 AddOwner 함수를 사용하여 더 많은 소유자를 추가 할 수 있기 때문에 가난한 사람이다.

감사합니다.

XAML

<StackPanel Button.Click="ButtonBase_OnClick"> 
    <Button Name="RealButton">Real button</Button> 
    <WpfWindow:VitalyControl MouseDown="UIElement_OnMouseDown"> 
     I am almost a button 
    </WpfWindow:VitalyControl> 
</StackPanel> 

코드 뒤에

사용자 정의 컨트롤 :

class VitalyControl : Label 
{ 
    public VitalyControl() 
    { 
     this.MouseDown += new MouseButtonEventHandler(VitalyControl_MouseDown); 
    } 

    void VitalyControl_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     RaiseEvent(new RoutedEventArgs(Button.ClickEvent, this)); 
    } 
} 

그리고 핸들러 :

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("Button was pressed"); 
    } 
+0

OwnerType은 Blend 및 VS와 같은 디자인 도구 및 디버깅에 더 많이 사용됩니다. RoutedEvent 객체의 인스턴스가있는 경우 라우트 된 이벤트가 속한 유형을 아는 것을 포함하여 라우트 된 이벤트를 알 수 있어야합니다. –

+0

@Joe White : 누구나 WPF에서 어떤 이벤트라도 던질 수 있습니까? 왜 아무도 WPF에서 모든 사람이 할 수있는 다른 사람의 이벤트를 유발할 수없는 C#과 같은 도약이 있습니까? – VitalyB

+1

나는 전에 그것에 대해 생각하지 않았지만 분명히 그렇게 생각했다. WPF의 많은 것들이 사람들이 WinForms에서 겪었던 피드백과 문제의 결과입니다. 그래서 나는 그들이이 변경을 의도적으로했다고 가정합니다. 그리고 @Steven Jeuris의 대답은 무관 한 수업을 통과 할 수 있기 때문에 과거처럼 그들을 사적인 개인으로 만드는 것이 어려웠을 것이라고 지적합니다. –

답변

3

이것은 의도적으로 설계된 동작으로, 실제로 RoutedEvents의 이유 중 하나입니다. 요소 트리를 통해 라우트되기 때문에 라우트 된 이벤트라고합니다. 발생한 문제는 msdn에 '단수 처리기 연결 지점'이라고합니다. StackPanel이 모든 Button.Click 이벤트를 수신하도록 지정합니다.

사용자 지정 컨트롤에서 단추 클릭 이벤트를 발생시킵니다. 이것은 이것을 처리하는 스택 패널까지 '버블 링'합니다.

UPDATE

:이 라우팅이 작동하려면

, 나는 어떤 라우트 된 이벤트를 제기 할 수 있어야 모든 UIElement에 가정 . 라우팅 이벤트는 UI 요소에서만 사용되며 WinForms 구현과의 복잡성에 대한 해답입니다. CLR 이벤트를 대체하지는 않습니다. 소유자 유형이 내부적으로 사용됩니다 when resolving an event by name.

+0

안녕하세요 스티븐, 나는 버블 링을 이해합니다. Click 이벤트를 발생시키기 위해 Button에 연결이 전혀없는 컨트롤의 기능에 대해 더 혼란 스럽습니다. 나는 이벤트의 소유자 만 그렇게 할 수 있어야한다고 생각한다. – VitalyB

+0

나는 엘리먼트 트리 위로 수신 된 이벤트를 라우트 할 수있는 UIElement에 대해 가능한 라우트 된 이벤트를 발생시킬 수 있어야하기 때문에 ** 이에 대한 이유를 추측하고있다. 사건을 해석하기 위해서는 공개해야합니다. 이것을 더 잘 캡슐화하는 것이 가능할 수도 있지만, 이것에 큰 이득이 없다고 나는 믿지 않는다. 라우팅 된 이벤트는 UI 요소에서만 사용됩니다. 라우트 된 이벤트는 CLR 이벤트를 대체하지 않습니다.UI 이벤트를 단순화합니다. –

+0

요약하면 :) - 모든 개체가 실제로 모든 이벤트를 발생시킬 수 있으며 모든 개체는 모든 이벤트를 잡을 수 있습니다. 소유자 유형은 이벤트의 캡슐화를 보호하도록 설계되지 않았으며 목표는 완전히 다른 것입니다. – VitalyB

관련 문제