2011-11-03 108 views
1

我有一個按鈕,通過調用它begin()像這樣添加委託功能第一單用

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

在網格然後滑出有按鈕滑出使用Storyboard的菜單。

每個按鈕,然後滑動電網回來當故事板完成對按鈕的動作,然後運行,因此像這樣,

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

一種選擇是在處理程序本身內將其刪除:

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

爲什麼在每一次點擊分配完成的事件處理程序EmailBtn_Click?在窗體構造函數或表單加載事件中執行。