2015-09-14 4 views
1

Поскольку я начал изучать C#, я видел несколько способов обработки событий. Скажем, у меня есть кнопка XAML как это:C# Методы обработки событий

<Button x:Name="button" Content="Click me!"/> 

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

  1. Изменить Click свойства кнопки, чтобы указать на метод в коде позади, как:

    <Button x:Name="button" Content="Click me!" Click="button_Click"/> 
    

    , а затем добавить, что button_Click метод к коду:

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
        button.Content = "Ow >_<"; 
    } 
    
  2. Обрабатывать событие через делегата в код:

    button.Click += delegate 
    { 
        button.Content = "Ow >_<"; 
    }; 
    
  3. Обрабатывать событие через лямбда-выражения в коде позади:

    button.Click += (object sender, RoutedEventArgs e) => 
    { 
        button.Content = "Ow >_<"; 
    }; 
    

Учитывая эти три методы, у меня есть пара вопросов:

  • В чем принципиальное отличие этих методов.
  • Есть ли случаи, когда один метод должен использовать вместо другого. Я видел тип 1, используемый главным образом в WPF и приложении WinRT, но два других я действительно видел только при использовании Xamarin.

ответ

1

С точки зрения утечки памяти вы попытались бы избежать подходов № 2 и № 3, если вы не являетесь абсолютно уверены, что это разовые подписки на события. Причина в том, как бы вы отменили подписку?

Задача не всегда видна при написании тривиального кода примера. Но что, если бы это была модель представления, создаваемая динамически снова и снова, на основе двойного щелчка пользователя по списку (или что-то в этом роде), и эта виртуальная машина подключала обработчик к событию другого класса? Когда одна или несколько из этих виртуальных машин выходят из сферы действия, как бы вы очистили подписку на события? Типичное удаление подписки будет выглядеть так:

otherClass.SomeEvent -= myHandler; 

Но как бы вы это сделать, если вы используете анонимный делегат, или лямбда? Это становится кошмаром, если вы каким-то образом вводите 2 или более лямбда с сигнатурами, которые .NET решает, равны. Argh.

2
  1. не является специфичным для WPF или WinRT, это характерно в .NET в конструкторе GUI щелкнуть на элементе управления телеграфировать события по умолчанию или нажмите на события в окне свойств Visual Studio. Вот как вы собираетесь собирать события на элементы управления большую часть времени. Обычно вы запускаете события с использованием 2. или 3., когда вы создаете динамические элементы управления во время выполнения, а сами события не отличаются друг от друга, но этап, на котором они созданы в жизненном цикле приложения, имеет большое значение для 2 и 3 ..
2

В чем принципиальное отличие этих методов?

Нет принципиальной разницы. Это просто разные способы регистрации обработчика события.

Другим способом (и рекомендуемым способом для более удобного приложения) для обработки событий является разделение представления (GUI) на модель представления (логика, лежащая в основе представления). Это называется шаблоном MVVM. WPF поддерживает привязку данных, и это позволяет вам определить команду в вашем классе модели просмотра, а затем вы можете присоединить кнопку в XAML к такой команде.

Посмотрите на this stackoverflow question для получения дополнительной информации.

+0

Вы упомянули WPF, но может ли тот же шаблон MVVM использоваться в универсальных приложениях WinRT? –

+1

Я никогда не работал с Universal Apps, но быстрый поиск в Google показывает некоторые примеры того, как это сделать. –

Смежные вопросы