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を使用して、文字列から列挙型を取得します。その後、スイッチが機能します。

編集:

もう少し説明する必要があります。ボタン名を値として列挙型を作成してから、名前を列挙型に変換して切り替えることができます。

うーん...さらに簡単な解決策: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 に答える