2012-02-10 31 views
12

Tôi có một nhiệm vụ rất thú vị mà tôi cần trợ giúp. Mô tả như sau:Làm cách nào để kích hoạt sự kiện tùy chỉnh từ Kiểm soát người dùng?

Tôi có một điều khiển người dùng (SomeUserControl), mà tôi đang sử dụng trong Cửa sổ chính. Tôi viết hoàn toàn ứng dụng của mình trên SomeUserControl và Cửa sổ chính đang lưu trữ SomeUserControl và không có gì khác.

Ngay bây giờ tôi có một nút tắt (trong SomeUserControl), đó là nghĩa vụ phải đóng cửa sổ chính. Lý do cho điều này là tôi không muốn bất cứ điều gì từ SomeUserControl để đóng ứng dụng riêng của mình, nhưng để bắn một sự kiện từ SomeUserControl, và cửa sổ chính nhận được nó, và cửa sổ chính sẽ đóng ứng dụng thay vì SomeUserControl.

Tôi làm cách nào? Tôi không quen với khái niệm tạo và xử lý các sự kiện tùy chỉnh, vì vậy nếu ai đó có thể giải thích nó bằng lời nói và trong mã làm ví dụ, tôi sẽ rất biết ơn bạn!

Chỉnh sửa: Đây là mã của tôi cho đến thời điểm này.

(trong Window 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 

(Trong Main Window) Công loginPage As New 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 

Mục tiêu: Tôi muốn đóng ứng dụng khi tôi nhấp hủy bỏ trong Cửa sổ 2, nhưng tôi không muốn làm điều đó theo cách mà Cửa sổ 2 đóng chính nó, nhưng bằng cách gửi một số thông báo đến Cửa sổ Chính và Chính Cửa sổ đóng ứng dụng.

Trả lời

14

Nếu logic của điều khiển người dùng được thực hiện trong "mã phía sau" của lớp điều khiển người dùng, hãy làm như sau.

Tôi giả định các tập tin XAML đã ở đâu đó một nút với một sự kiện click:

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

Sau đó, trong mã của bạn phía sau cho lớp SomeUserControl, thực hiện như sau:

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

    ... 

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

Trong của bạn Cửa sổ chính, hãy nghe sự kiện:

... 

someUserCtrl.CloseApp += new EventHandler(MyFn); 

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

giống như giải pháp AkselK cung cấp, làm thế nào để làm điều đó trong VB? đặc biệt là một phần trong If (CloseApp! = null). Bởi vì intellisense không thể tìm thấy CloseApp. - will0809 20 phút trước – will0809

+0

Tôi đang có cùng một câu hỏi nhưng tôi đang sử dụng MVVM, vì vậy tôi không thể sử dụng này: - someUserCtrl.CloseApp + = new EventHandler (MyFn); Thay vào đó tôi đã sử dụng thư viện MVVM Light và thêm trình kích hoạt sự kiện vào MainWindow của tôi dưới dạng < /i:Interaction.Triggers> Nhưng nó không hoạt động. –

1

Cách đơn giản nhất để làm điều này là để tuyên bố một sự kiện tùy chỉnh:

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

Sau đó, bạn đăng ký vào các sự kiện Shutdown trong MainWindow, và xử lý luận lý tắt máy đó. Và trong SomeUserControl, bạn chỉ cần chạy OnShutdown khi bạn muốn tắt ứng dụng của mình.

+1

Tôi đang chuyển đổi thành VB cho những người cần nó. 'Công Đại biểu Sub ShutdownEventHandler (người gửi Như Object, e Như EventArgs) Công tổ chức sự kiện ShutItDown Như ShutdownEventHandler' ' Công tổ chức sự kiện ShutItDown Như ShutdownEventHandler' nhưng tôi không quá chắc chắn về phần thứ ba. Intellisense không nhận ra "ShutItDown" bên trong câu lệnh If. – will0809

+0

cũng vậy, tôi sẽ đọc về cách đăng ký sự kiện tắt máy, vì tôi không biết làm thế nào. Nếu bạn có thể giải thích nó trong thời gian nhanh gấp đôi nó sẽ là tuyệt vời. – will0809

+1

Không cần phải định nghĩa 'ShutdownEventHandler' ở đây, vì nó giống hệt' System.EventHandler'. Khai báo sự kiện đơn giản có thể được viết là 'sự kiện công cộng EventHandler Shutdown;'. – Clemens

Các vấn đề liên quan