0

閉じるボタンの一般化されたイベントを作成しようとしています。ウィンドウを閉じる必要がありますが、その前に所有者ウィンドウにフォーカスを設定します。アプリケーションに30以上のウィンドウがあるため、それはかなり非現実的であるため、そのためのすべてのファイルにイベントを設定したくありません。(そのため、その動作を変更したい場合は、毎回 30 個のファイルを変更する必要があります)

それが正しいアプローチかどうかはわかりませんdelegate(object sender, RoutedEventArgs e)が、コードは次のとおりです。

delegate void RoutedDelegate(object sender, RoutedEventArgs e);
[MarkupExtensionReturnType(typeof(RoutedEvent))]
public class CloseWindowExtension : MarkupExtension
{
    Window win = null;

    public Window Win
    {
        get { return this.win; }
        set { this.win = value; }
    }

    public CloseWindowExtension(Window win)
        : base()
    {
        this.win = win;
    }



    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (win == null)
        {
            throw new InvalidOperationException("The window must be specified!");
        }

        return new RoutedDelegate(delegate(object sender, RoutedEventArgs e)
        {
            Extensions.FocusClose(win);
        });
    }
}

FocusClose メソッドは、ウィンドウを取得して閉じますが、以前にその所有者にフォーカスを設定します。しかし、私はそれを機能させることはできません。ボタンをxamlに設定すると、

Button Click="{e:CloseWindow {Binding win}}"

(win は私のウィンドウ名です)、次のエラー メッセージが表示されます。

Click="{e:CloseWindow {Binding win}}" は無効です。'{e:CloseWindow {Binding win}}' は、有効なイベント ハンドラー メソッド名ではありません。生成されたクラスまたはコード ビハインド クラスのインスタンス メソッドのみが有効です。行 28 位置 17。

私は何か間違ったことをしていますか?これが最善のアプローチですか、それとも別のオプションがありますか? 前もって感謝します!

クラーク

4

2 に答える 2

1

マークアップ拡張機能を使用してイベント ハンドラーを設定することはできません。代わりに、アタッチされた動作を使用して、コマンドをイベントにバインドできます。

詳細については、Marlon Grech によるこの記事を参照してください。

于 2010-07-04T21:35:10.297 に答える