2012-02-10 5 views
12

나는 도움이 필요한 매우 흥미로운 일이있다. 설명은 다음과 같습니다 :사용자 정의 컨트롤에서 사용자 정의 이벤트를 발생시키는 방법은 무엇입니까?

저는 메인 윈도우에서 사용하고있는 사용자 컨트롤 (SomeUserControl)을 가지고 있습니다. 내 응용 프로그램을 전적으로 SomeUserControl에 작성하고 Main Window는 SomeUserControl을 호스팅하며 다른 것은 아무것도 사용하지 않습니다.

지금은 메인 윈도우를 닫아야하는 종료 버튼 (SomeUserControl에서)이 있습니다. 그 이유는 SomeUserControl에서 응용 프로그램 자체를 닫지 않고 SomeUserControl에서 이벤트를 발생시키고 Main Window가이를 수신하고 MainUser가 SomeUserControl 대신 응용 프로그램을 닫을 수 있기를 원하기 때문입니다.

어떻게해야합니까? 커스텀 이벤트를 생성하고 처리하는 개념에 익숙하지 않습니다. 누군가가 단어와 코드로 예제로 설명 할 수 있다면, 나는 당신에게 매우 감사 할 것입니다!

편집 : 여기까지 내 코드가 있습니다.

(창 2)

Public Event CloseApp As EventHandler (메인 창에서)

Private Sub CancelButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles CancelButton.Click 
    DialogResult = False 
    RaiseEvent CloseApp(Me, New EventArgs) 
End Sub 

공공 loginPage 새로운 LoginPage

Public Sub New() 
    InitializeComponent() 
    AddHandler loginPage.CloseApp, AddressOf Me.ShutDownJobChangeWindow 
End Sub 

Private Sub ShutDownJobChangeWindow(ByVal sender As Object, ByVal e As EventArgs) 
    Application.Current.Shutdown() 
End Sub 

목표로 : 내가 클릭하면 응용 프로그램을 닫으려면 윈도우 2에서는 취소하지만, 윈도우 2가 닫히는 방식으로 처리하고 싶지는 않지만 메인 윈도우에 알림을 보내고 Main 창이 응용 프로그램을 닫습니다.

public delegate void ShutdownEventHandler (object sender, EventArgs data); 
public event ShutdownEventHandler Shutdown; 
protected void OnShutdown(EventArgs args) 
{ 
    if(Shutdown != null) 
     Shutdown(this, args); 
} 

그런 다음 당신은 MainWindow를의 종료 이벤트에 가입하고, 거기에 종료 로직을 ​​처리 :

답변

14

사용자 정의 컨트롤의 논리가 사용자 정의 컨트롤의 "코드 숨김"에서 구현되는 경우 다음을 수행하십시오.

내가 클릭 이벤트와 어딘가 버튼을 XAML 파일이 있으리라 믿고있어 :

<Button Click="Button_Click">Close App</Button> 

를 그런 다음 코드에서 뒤에 SomeUserControl 클래스, 다음을 수행하십시오에서

public partial class SomeUserControl : UserControl 
{ 
    public event EventHandler CloseApp; 

    ... 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if(CloseApp != null) { 
      CloseApp(this, new EventArgs()); 
     } 
    } 
} 

당신의 메인 윈도우에서 다음 이벤트 수신 :

... 

someUserCtrl.CloseApp += new EventHandler(MyFn); 

private void MyFn(object sender, object EventArgs e) { 
    ... 
} 
+0

, 어떻게 그것을 VB에서해야합니까? 특히 If의 부분 (CloseApp! = null). Intellisense는 CloseApp을 찾을 수 없기 때문에. - will0809 20 분 전 – will0809

+0

내가 같은 질문을 데하지만 난 MVVM을 사용하고, 그래서이 사용할 수 없습니다 : - someUserCtrl.CloseApp + = 새로운 이벤트 핸들러 (MyFn를); 오히려 내가 MVVM 빛 라이브러리를 사용하고 나의 MainWindow를에 이벤트 트리거를 추가 <명령 : EventToCommand 명령 = "{바인딩 CloseAppCommand PassEventArgsToCommand ="진정한 "/>< /i:Interaction.Triggers는> 는하지만 그것은 작동하지 않습니다. –

1

이 작업을 수행하는 가장 간단한 방법은 사용자 정의 이벤트를 선언하는 것입니다. 그리고 SomeUserControl에서는 응용 프로그램을 종료 할 때 OnShutdown을 실행하기 만하면됩니다.

+1

나는 이것을 필요한 사람들을 위해 VB로 변환 중입니다. '공공 위임 하위 ShutdownEventHandler (EventArgs입니다으로 개체로 보낸 사람, 전자) 공공 이벤트 ShutItDown ShutdownEventHandler' '공공 이벤트 ShutItDown으로 ShutdownEventHandler' 그러나 나는 세 번째 부분에 대해 너무 확실하지 않다. Intellisense는 If 문에서 "ShutItDown"을 인식하지 못합니다. – will0809

+0

또한 방법을 모르므로 종료 이벤트를 구독하는 방법을 읽으 려합니다. 당신이 두 배 빠른 시간 안에 그것을 설명 할 수있는 경우에 중대 할 것이다. – will0809

+1

이 System.EventHandler''동일하기 때문에, 여기에'ShutdownEventHandler'을 정의 할 필요가 없습니다. 이벤트 선언은'public event EventHandler Shutdown;'으로 간단히 작성할 수 있습니다. 제공되는 솔루션 AkselK 같은 – Clemens

관련 문제