Подтвердить что ты не робот

Как запустить пользовательское событие из пользовательского элемента управления?

У меня очень интересная задача, с которой мне нужна помощь. Описание выглядит следующим образом:

У меня есть пользовательский элемент управления (SomeUserControl), который я использую в главном окне. Я полностью пишу свое приложение на SomeUserControl, а в главном окне размещается SomeUserControl и ничего больше.

Сейчас у меня есть кнопка отключения (в SomeUserControl), которая должна закрыть главное окно. Причина этого заключается в том, что я не хочу ничего из SomeUserControl для закрытия самого приложения, но для запуска события из SomeUserControl, и Main Window получает его, а Main Window закрывает приложение вместо 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

(В главном окне)   Public LogPage 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

Цель: я хочу закрыть приложение, когда я нажму "отменить" в окне 2, но я не хочу делать его таким образом, чтобы окно 2 закрывалось, но, отправив некоторое уведомление в главное окно и в главное окно закрывает приложение.

4b9b3361

Ответ 1

Если логика пользовательского элемента управления реализована в "коде позади" пользовательского класса управления, выполните следующие действия.

Я предполагаю, что в файле XAML есть кнопка с событием click:

<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 ) {
    ...
}

Ответ 2

Самый простой способ сделать это - объявить пользовательское событие:

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

Затем вы подписываетесь на событие Shutdown в MainWindow и обрабатываете логику завершения работы. И в SomeUserControl вы просто запускаете OnShutdown, когда хотите закрыть приложение.