【问题标题】:Set button name from enum_从 enum_ 设置按钮名称
【发布时间】:2012-09-12 09:08:43
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试过使用 Tag 属性来确定单击了哪个 Button?这样您就不必担心名称更改。

标签: c# wpf


【解决方案1】:

使用Enum.Parse 从字符串中获取枚举。然后你的开关就可以工作了。

编辑:

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

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

【讨论】:

  • 我喜欢使用 msoAutoShapeType 值作为按钮名称的想法,但我不知道该怎么做。据我所知,按钮名称只能是一个字符串?如果你知道怎么做,可以举个例子吗?
【解决方案2】:

到目前为止,我想出的唯一好方法是不使用 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));
    }

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

【讨论】:

  • 用字典代替 if 链怎么样?它会更容易阅读和维护。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2018-11-16
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多