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));
    }

但这不起作用,因为比较需要一个常数......

4

2 回答 2

1

使用Enum.Parse从字符串中获取枚举。然后您的开关将起作用。

编辑:

我应该再解释一下:您可以使用按钮名称作为值创建枚举,然后将 Name 转换为枚举并进行切换。

嗯...更简单的解决方案:您可以使用 MsoAutoShapeType 值作为按钮名称或标签,然后在单击处理程序中将其转换为枚举,从而消除 switch 子句。

于 2012-09-12T09:20:29.130 回答
0

到目前为止,我想出的唯一好方法不是使用 switch 语句,而是在事件函数中使用单独的 if 块来检查调用者姓名。像这样的东西:

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));
    }

到目前为止,我能想到的唯一一种足够强大以应对重命名按钮的方法。如果有任何替代方案,我最有兴趣了解它们。

于 2012-09-13T04:05:38.987 回答