首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义标记扩展返回RoutedEvents

自定义标记扩展返回RoutedEvents
EN

Stack Overflow用户
提问于 2010-07-05 03:05:07
回答 2查看 464关注 0票数 0

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

我不确定这是否是正确的方法,但我尝试了做一个返回delegate(object sender, RoutedEventArgs e)的MarkUp扩展,下面是代码:

代码语言:javascript
复制
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中设置按钮时,

代码语言:javascript
复制
Button Click="{e:CloseWindow {Binding win}}"

(win是我的窗口名),我得到错误消息:

绑定“{e:CloseWindow{Click=}}”无效。“{e:CloseWindow {Binding win}}”不是有效的事件处理程序方法名。只有生成的类或代码隐藏类上的实例方法有效。第28行位置17。

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

克拉克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-05 05:35:10

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-07-06 02:31:10

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3175854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档