2011-05-16 40 views
0

我有一個簡單的位圖編輯器,用於小型單色位圖。我有一個菜單可以選擇筆和強盜的厚度。問題是我不喜歡下面的代碼。有什麼辦法可以使它更緊湊嗎?有沒有什麼辦法可以爲stripMenuItems分組類似的處理程序?

private void toolStripMenuItem4_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 3; 
    } 

    private void toolStripMenuItem3_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 2; 
    } 

    private void toolStripMenuItem2_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 1; 
    } 

    private void toolStripMenuItem5_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 4; 
    } 

    private void toolStripMenuItem6_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 5; 
    } 

    private void toolStripMenuItem7_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 6; 
    } 

    private void toolStripMenuItem8_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 7; 
    } 

    private void toolStripMenuItem9_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 8; 
    } 

    private void toolStripButton3_Click_1(object sender, EventArgs e) 
    { 
     CurrentPanel.EditMode = EditMode.Clear; 
    } 

    private void toolStripDropDownButton2_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.EditMode = EditMode.FreeHand; 
    } 

    private void toolStripSplitButton1_ButtonClick(object sender, EventArgs e) 
    { 
     CurrentPanel.EditMode = EditMode.Clear; 
    } 

    private void toolStripMenuItem10_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 1; 
    } 

    private void toolStripMenuItem11_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 2; 
    } 

    private void toolStripMenuItem12_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 3; 
    } 

    private void toolStripMenuItem13_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 4; 
    } 

    private void toolStripMenuItem14_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 5; 
    } 

    private void toolStripMenuItem15_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 6; 
    } 

    private void toolStripMenuItem16_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 7; 
    } 

    private void toolStripMenuItem17_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 8; 
    } 

    private void toolStripMenuItem18_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 16; 
    } 

    private void toolStripMenuItem19_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.RobberThickness = 32; 
    } 

    private void toolStripMenuItem21_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 32; 
    } 

    private void toolStripMenuItem20_Click(object sender, EventArgs e) 
    { 
     CurrentPanel.PenThickness = 16; 
    } 

回答

4
private void toolStripMenuItemCommon_Click(object sender, EventArgs e) 
{ 

    ToolStripMenuItem item = (ToolStripMenuItem) sender; 
    int thickness = (int)item.Tag; 

    CurrentPanel.PenThickness = thickness ; 
} 

當然,你需要初始化各ToolStripMenuItemTag並設置toolStripMenuItemCommon_ClickClick處理程序事件。你可以做一個for週期,例如:

for(int i = 1; i < 8; i++) 
{ 
    ToolStripMenuItem item = new ToolStripMenuItem(); 
    item.Text = "Set thickness: " + i; 
    item.Click += toolStripMenuItemCommon_Click; 
    item.Tag = i; 

    // add item to strip container 
} 
+0

這樣比較好。但是我怎樣才能使用循環,通過使用反射? – Peter17 2011-05-16 11:08:41

+0

加入回答:) – 2011-05-16 11:15:04

+0

我明白了。不利的是,我將無法在設計器中看到這個菜單。 – Peter17 2011-05-16 11:19:31

1

試試這個:

private void toolStripMenuItem_Click(object sender, EventArgs e)  
{   
    ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem) sender; 

    switch (toolStripMenuItem.ID) 
    { 
     case "toolStripMenuItem4": 
     { 
       CurrentPanel.PenThickness = 3;  
       break; 
     } 
     .......... 
     .......... 
    } 

} 
2

是的,有:

private void SetPenThickness(int thickness) 
{ 
    CurrentPanel.PenThickness = thickness; 
} 

toolStripMenuItem1.Click += (s,e) => SetPenThickness(1); 
toolStripMenuItem2.Click += (s,e) => SetPenThickness(2); 
toolStripMenuItem3.Click += (s,e) => SetPenThickness(3); 
toolStripMenuItem4.Click += (s,e) => SetPenThickness(4); 
// ... 
+0

我知道LAMBDA,但因爲我需要重新編寫代碼類似的行不會做出太大的差別。 – Peter17 2011-05-16 11:06:45

相關問題