微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何以编程方式创建WPF按钮和传递参数

如何解决如何以编程方式创建WPF按钮和传递参数

正如标题所示,我需要在WPF应用程序中以编程方式创建按钮,每个按钮都与集合中的对象相关联,以便click事件将使用该对象作为参数。

例如:

public FooWindow(IEnumberable<IFoo> foos)
{
    InitializeComponent();

    foreach(var foo in foos)
    {
        // Button creation code goes here,using foo
        // as the parameter when the button is clicked

        button.Click += Button_Click;
    }
}

private void Button_Click(object sender,RoutedEventArgs e)
{
    // Do what you need to do with the IFoo object associated
    // with the button that called this event
}

到目前为止,我所见过的所有解决方案都涉及使用命令(这很好,但对于本应用程序来说似乎过于复杂),以不寻常的方式使用xaml标记,或者未解决将对象自动分配为调用click事件时应使用的参数。

我想出了一个我很满意的解决方案,所以我会回答我自己的问题,但是其他人可以根据自己的意愿提出自己的解决方案。

解决方法

我的解决方案涉及创建一个自定义按钮,该按钮继承自在实例化时分配了可公开访问的IFoo对象的Button。

class FooButton : Button
{
    public IFoo Foo { get; private set; }

    public FooButton(IFoo foo) : base()
    {
        Foo = foo;
    }
}

然后将实例化此自定义按钮代替Button,并在那时分配IFoo对象。单击该按钮时,可以检索IFoo对象并将其作为参数传递,也可以根据需要使用。

public FooWindow(IEnumberable<IFoo> foos)
{
    InitializeComponent();

    foreach(var foo in foos)
    {
        var button = new FooButton(foo);
        button.Click += Button_Click;
        // Add the button to your xaml container here
    }
}

private void Button_Click(object sender,RoutedEventArgs e)
{
    if(sender is FooButton button)
    {
        // Do what you need to do here,using button.Foo as
        // your parameter
    }
}

我不知道此解决方案的可扩展性。我不是wpf或xaml专家。我敢肯定,使用命令模式可以提供更多的灵活性,并可以控制很多其他事情,但是对于执行此操作的简单,快速的方法,这已经足够了。 :)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。