2012-09-12 110 views
1

我在WPF窗口上有很多按鈕。爲了避免重複編碼相同的點擊事件,我希望它們都觸發相同的方法,並根據我所調用的按鈕採取適當的操作。從枚舉設置按鈕名稱

我知道我可以將發件人轉換爲按鈕,然後檢查名稱並從那裏發送代碼,但是必須將所有名稱硬編碼,如果按鈕被重命名爲某個階段。

這樣做的更好方法是什麼?例如,我可以從枚舉中命名按鈕嗎?或者是否可以通過直接實際引用按鈕來獲取檢查的按鈕名稱?

也許這樣的事情?

private void btnAddTerminatorElement_Click(object sender, RoutedEventArgs e) 
    { 
     MsoAutoShapeType shapeType; 

     switch (((Button)sender).Name) 
     { 
      case this.btnAddTerminatorElement.Name: 
       shapeType = MsoAutoShapeType.msoShapeFlowchartTerminator; 
       break; 

     } 

     CreateChartElement(this.targetWorksheet.Shapes.AddShape(MsoAutoShapeType.msoShapeFlowchartTerminator, 100, 100, 50, 50)); 
    } 

但這無法正常工作,是因爲需要比較恆定的...

+0

您是否嘗試過使用Tag屬性來確定哪個按鈕被點擊?這樣你就不必擔心名稱的變化。 – Eirik

回答

0

到目前爲止我唯一不錯的方法是不使用switch語句,而是在事件函數中單獨使用塊來檢查調用者名稱。事情是這樣的:

private void btnAddTerminatorElement_Click(object sender, RoutedEventArgs e) 
    { 
     Button button = (Button)sender; 
     MsoAutoShapeType shapeType = MsoAutoShapeType.msoShapeRectangle; 

     if (sender == this.btnAddTerminatorElement) 
      shapeType = MsoAutoShapeType.msoShapeFlowchartTerminator; 

     if (sender == this.btnAddDecisionElement) 
      shapeType = MsoAutoShapeType.msoShapeFlowchartDecision; 

     CreateChartElement(this.targetWorksheet.Shapes.AddShape(shapeType, 100, 100, 50, 50)); 
    } 

我能想到的,到目前爲止是足夠強大,唯一的方法,以應對重命名的按鈕。如果有什麼其他的選擇,我會最有興趣聽到他們的消息。

+0

如何讓字典而不是ifs鏈?閱讀和維護會更容易。 –

+0

啊,這是一個好主意。謝謝 :) –

1

使用Enum.Parse從字符串獲取枚舉。然後您的交換機將工作。

編輯:

我要解釋它也許有點多:你可以創建按鈕名稱作爲值枚舉,然後再轉換名稱ENUM和做開關。

嗯...更簡單的解決方案:您可以使用MsoAutoShapeType值作爲按鈕名稱或標籤,然後將其轉換爲枚舉處理器中的枚舉,從而消除切換子句。

+0

我喜歡使用按鈕名稱的msoAutoShapeType值的想法,但我不知道如何去做。據我可以告訴按鈕名稱只能是一個字符串?如果你知道如何去做,你能舉個例子嗎? –