0

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

我不确定这是否是正确的方法,但我尝试制作一个返回 adelegate(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 回答
0

.NET 4.5+ 支持事件的标记扩展,所以你现在可以实现你想要的:)

于 2016-07-05T18:31:10.200 回答