自定义标记扩展会返回路由事件

时间:2010-07-04 19:05:07

标签: wpf xaml delegates routed-events markup-extensions

我正在尝试为我的关闭按钮创建一个通用事件,他们必须关闭窗口,但在此之前将焦点设置为所有者窗口。我不希望每个文件都有一个事件,因为我的应用程序中有30多个窗口,因此这非常不实用。 (所以,如果我想改变这种行为,我每次都要改变30个文件)

我不确定这是否是正确的方法,但我尝试制作一个MarkUp Extension,它返回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位。

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

克拉克

2 个答案:

答案 0 :(得分:1)

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

有关详细信息,请参阅Marlon Grech的this article

答案 1 :(得分:0)

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