Как запустить пользовательское событие из пользовательского элемента управления? - PullRequest
12 голосов
/ 10 февраля 2012

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

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

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

Ответы [ 3 ]

15 голосов
/ 10 февраля 2012

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

Я предполагаю, что в файле 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 ) {
    ...
}
1 голос
/ 10 февраля 2012

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

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, когда хотите закрыть приложение.

0 голосов
/ 05 ноября 2018

У меня была такая же проблема, и я решил таким образом:

если вы используете soft версию MVVM (с soft Я имею в виду, что вы используете codebehind для обработки событий) и ваше событие находится в ModelView класс сделать это:

В вашем главном окне:

    public MainWindow(ViewModels.MyViewModel vm)
    {
        InitializeComponent();

        //pass the istance of your ViewModel to the MainWindow (for MVVM patter)
        this.vm = vm;

        //Now pass it to your User Control 
        myUserControl.vm = vm;
    }

В вашем UserControl

    public partial class MyUserControl: UserControl
    {
           public ViewModels.MyViewModel  vm;

           public MyUserControl()
           {
                 InitializeComponent();
           }

           private void button_Click(object sender, RoutedEventArgs e)
           {
                 vm.MyMethod();
           }
     }

И последнее, но не менее важное: в xaml вашего MainWindow вставьте свой пользовательский элемент управления и дайте ему имя:

<local:MyUserControl x:Name="myUserControl" />

Если вы не хотите использовать ViewModel, вы можете просто передать в свой UserControl экземпляр вашего MainWindow, а затем запустить в codebehind своего пользовательского контроля все публичные методы вашего MainWindow.

Надеюсь, это поможет!

Извините, вопрос VB, поэтому вот версия VB кода выше:

MainWindow:

Public Sub New(ByVal vm As ViewModels.MyViewModel)
   InitializeComponent()
   Me.vm = vm
   myUserControl.vm = vm
End Sub

UserControl:

Public Partial Class MyUserControl
   Inherits UserControl

   Public vm As ViewModels.MyViewModel

   Public Sub New()
       InitializeComponent()
   End Sub

   Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
       vm.MyMethod()
   End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...