自定义标记扩展名返回路由Events
-
02-10-2019 - |
题
我正在尝试为我的关闭按钮创建一个广义事件,它们必须关闭窗口,但在将重点放在所有者窗口之前。我不想为此提供每个文件的活动,因为这是非常不可行的,因为我的应用程序中有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+支持事件的标记扩展,因此您可以立即实现您想要的内容:)
不隶属于 StackOverflow