我正在尝试为我的关闭按钮创建一个广义事件,它们必须关闭窗口,但在将重点放在所有者窗口之前。我不想为此提供每个文件的活动,因为这是非常不可行的,因为我的应用程序中有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}}"

(赢是我的窗口名称),我收到错误消息:

单击=“ {e:CloseWindow {binding win}}”无效。 '{e:CloseWindow {binding win}}'不是有效的事件处理程序方法名称。在生成或代码范围类上的实例方法是有效的。第28行位置17。

难道我做错了什么?这是最好的方法还是我还有其他选择?提前致谢!

克拉克

有帮助吗?

解决方案

您不能使用标记扩展程序来设置事件处理程序。相反,您可以使用附件的行为,该行为使您可以将命令绑定到事件。

本文 Marlon Grech的细节

其他提示

.NET 4.5+支持事件的标记扩展,因此您可以立即实现您想要的内容:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top