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");
}
OwnerType은 Blend 및 VS와 같은 디자인 도구 및 디버깅에 더 많이 사용됩니다. RoutedEvent 객체의 인스턴스가있는 경우 라우트 된 이벤트가 속한 유형을 아는 것을 포함하여 라우트 된 이벤트를 알 수 있어야합니다. –
@Joe White : 누구나 WPF에서 어떤 이벤트라도 던질 수 있습니까? 왜 아무도 WPF에서 모든 사람이 할 수있는 다른 사람의 이벤트를 유발할 수없는 C#과 같은 도약이 있습니까? – VitalyB
나는 전에 그것에 대해 생각하지 않았지만 분명히 그렇게 생각했다. WPF의 많은 것들이 사람들이 WinForms에서 겪었던 피드백과 문제의 결과입니다. 그래서 나는 그들이이 변경을 의도적으로했다고 가정합니다. 그리고 @Steven Jeuris의 대답은 무관 한 수업을 통과 할 수 있기 때문에 과거처럼 그들을 사적인 개인으로 만드는 것이 어려웠을 것이라고 지적합니다. –