添加委托函数首先单独使用

时间:2011-11-03 15:18:30

标签: c# silverlight windows-phone-7

我有一个按钮,通过调用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 个答案:

答案 0 :(得分:2)

一种选择是在处理程序本身中删除它:

EventHandler handler = null;
handler = delegate(object s, EventArgs se) {
    SlideOut_Completed(s, se, "Email");
    SlideOut.Completed -= handler;
};
SlideOut.Completed += handler;
SlideOut.Begin();

答案 1 :(得分:0)

为什么在每次点击时分配Completed事件处理程序EmailBtn_Click?在表单构造函数或表单加载事件中执行。