Добавление функций делегата в первый раз - PullRequest
1 голос
/ 03 ноября 2011

У меня есть кнопка, которая выдвигает меню, используя раскадровку, вызывая begin() на нем, например,

    private void ShareBtn_Click(object sender, RoutedEventArgs e)
    {
        SlideIn.Begin();
    }

На сетке, которая затем выдвигается, есть кнопки.

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

    private void PictureBtn_Click(object sender, RoutedEventArgs e)
    {
        CertificateDisplay.SaveAsPicture();
    }

    private void FacebookBtn_Click(object sender, RoutedEventArgs e)
    {
        App.facebookSuccess = false;
        NavigationService.Navigate(new Uri("/FBLogin.xaml", UriKind.Relative));
    }

    private void SMSBtn_Click(object sender, RoutedEventArgs e)
    {
        SlideOut.Begin();
        SlideOut.Completed += delegate(object s, EventArgs se) { SlideOut_Completed(s, se, "Email"); };
    }

    private void EmailBtn_Click(object sender, RoutedEventArgs e)
    {
        SlideOut.Begin();
        SlideOut.Completed += delegate(object s, EventArgs se) { SlideOut_Completed(s, se, "Email"); };
    }

    void SlideOut_Completed(object sender, EventArgs e, String shareType)
    {
        switch (shareType)
        {
            case "Email":
               ...
            default:
               break;
        }
    }

Ошибка, с которой я столкнулся, если не могу удалить анонимные функции из стека событий.

Мне удалось решить эту проблему, сделав shareType общую переменную для всех вышеперечисленных функций и не используя анонимный делегат, а затем удалив "именованные" функции из стека событий при вызове OnNavigatedFrom.

Есть ли способ сделать это, продолжая использовать эти делегаты, потому что это выглядит аккуратнее?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Один из вариантов - удалить его из самого обработчика:

EventHandler handler = null;
handler = delegate(object s, EventArgs se) {
    SlideOut_Completed(s, se, "Email");
    SlideOut.Completed -= handler;
};
SlideOut.Completed += handler;
SlideOut.Begin();
0 голосов
/ 03 ноября 2011

Зачем назначать обработчик события Completed EmailBtn_Click при каждом нажатии?Сделайте это в конструкторе формы или в событии загрузки формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...