2014-01-15 457 views
4

我想知道什麼是最好的方式來處理30左右MenuItems點擊事件?處理MenuItem Click事件的最佳方法是什麼?

我首先想到的是明明只創建一個事件偵聽器爲每個菜單項,像這樣:

XAML:

<Menu Name="MainMenu" IsMainMenu="True" Height="25"> 
     <MenuItem Header="_File" > 
      <MenuItem Name="New" Header="_New" Click="MenuItem_NewClick" /> 
      <MenuItem Name="Open" Header="_Open" Click="MenuItem_OpenClick" /> 
      <MenuItem Name="Save" Header="_Save" Click="MenuItem_SaveClick" /> 
     </MenuItem> 
</Menu> 

C#1:

private void MenuItem_NewClick(object sender, RoutedEventArgs e) 
{   
    //Do work... 
} 
private void MenuItem_OpenClick(object sender, RoutedEventArgs e) 
{ 
    //Do work... 
} 
private void MenuItem_SaveClick(object sender, RoutedEventArgs e) 
{ 
    //Do work... 
} 

但這似乎凌亂,尤其是對於不需要複製或粘貼等許多代碼的MenuItems。

我可以改用一個事件偵聽器,並使用IF /機箱檢查菜單項和消除一切多餘的事件監聽器,像這樣:

C#2:

private void MenuItem_FileClick(object sender, RoutedEventArgs e) 
    { 
     MenuItem item = e.OriginalSource as MenuItem; 
     switch (item.Name) 
     { 
      case "New": 
       MessageBox.Show("New File Created."); 
       break; 
      case "Open": 
       MessageBox.Show("File Opened Created."); 
       break; 
      case "Save": 
       MessageBox.Show("File Saved."); 
       break; 
     } 
    } 

這似乎多少更清潔,但同時也很麻煩,如果MenuItems需要做更多的工作,而不是打開另一個窗體或清除一些控件。如果需要複雜的邏輯,我可以調用一個函數,但我認爲這會導致意大利麪代碼?

什麼是最優雅的方式來處理?

感謝, 坦納

回答

2

我經常做這樣的設置在那裏我試圖將UI從行動正在執行單獨的操作的事情。

 var actions = new Dictionary<string, Func<MenuItem, RoutedEventHandler>>() 
     { 
      { "New", mi => (s, e) => { MessageBox.Show("New File Created."); }}, 
      { "Open", mi => (s, e) => { MessageBox.Show("File Opened."); }}, 
      { "Save", mi => (s, e) => { MessageBox.Show("File Saved."); }}, 
     }; 

     foreach (MenuItem mi in FileMenu.Items) 
     { 
      if (actions.ContainsKey(mi.Name)) 
      { 
       mi.Click += actions[mi.Name](mi); 
      } 
     } 

關於這一點的好處是,你顯式地有一個強類型的mnu項的引用。你可以這樣做,例如,定義每個項目時:

  { 
       "New", 
       mi => 
        (s, e) => 
        { 
         MessageBox.Show("New File Created."); 
         MessageBox.Show(
          String.Format("You clicked the {0} menu.", mi.Name)); 
        } 
      }, 

你可以看到,該mi變量到lambda表達式通過。

當您退出表單時,您確實需要做相反的事情來分離事件處理程序,但它不會比附加代碼更難。如果你很聰明,你可以編寫代碼,當你做連接時準備分離,以便以後很容易分離。

+0

有趣!你能解釋爲什麼這是一種比僅僅使用病例陳述更好的方法嗎?這看起來很相似。 –

相關問題