我试图为我的Close按钮创建一个通用的事件,在此之前,它们必须关闭窗口,但将焦点设置为所有者窗口。我不想为每个文件都有一个事件,因为这是非常不切实际的,因为我的应用程序中有30+窗口。(因此,如果我想要改变这种行为,我每次都必须更改30个文件)
我不确定这是否是正确的方法,但我尝试了做一个返回delegate(object sender, RoutedEventArgs e)的MarkUp扩展,下面是代码:
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是我的窗口名),我得到错误消息:
绑定“{e:CloseWindow{Click=}}”无效。“{e:CloseWindow {Binding win}}”不是有效的事件处理程序方法名。只有生成的类或代码隐藏类上的实例方法有效。第28行位置17。
我做错了什么吗?这是最好的方法吗?还是我还有其他选择?提前感谢!
克拉克
发布于 2010-07-05 05:35:10
不能使用标记扩展来设置事件处理程序。相反,您可以使用附加的行为,该行为允许您将命令绑定到事件。
有关详细信息,请参阅Marlon Grech的this article
发布于 2016-07-06 02:31:10
.NET 4.5+支持事件的标记扩展,因此您现在可以实现您想要的:)
https://stackoverflow.com/questions/3175854
复制相似问题