形成沟通的形式

时间:2014-02-27 19:07:53

标签: c# winforms visual-studio-2013

我的第一个表格=主要,我的第二个表格= ChampionSelect 。我用这个

从Main打开ChampSelect
private void pictureBox_championSelect_Click(object sender, EventArgs e)
{
    ChampionSelect champSlct = new ChampionSelect();
    champSlct.Show();
}

它会打开,显示12个图标作为图片框。

现在根据用户点击的图标

我希望它将上的pictureBox_championSelect的图像更改为 ChampionSelect 上点击的图标的图像。

对于Ex: 如果您点击 ChampionSelect 中的Ace图标,则应更改主要<上的pictureBox_championSelect图片/ strong>到我导入资源的Ace.png。

所以我试过这个

public partial class ChampionSelect : Form
{
    public ChampionSelect()
    {
        InitializeComponent();
        this.champSlct = Main;
    }

    Main champSlct;


    public void icon_slctAce_Click(object sender, EventArgs e)
    {
        champSlct.pictureBox_championSelect.Image = Properties.Resources.Ace;

    }

我从这里的另一篇文章中学到了,但是,它说“Main是'Type'但是像变量一样使用”并且不起作用。最终我将根据点击的图标更改其他内容,但我认为它将与此类似,因此正确方向上的一点将更有帮助。

2 个答案:

答案 0 :(得分:3)

您可以在ChampionSelect表单中创建一个事件,并在Main中创建一个更改图像的处理程序:

public partial class ChampionSelect : Form {
    public class ChampionSelectedEventArgs: EventArgs {
        public Image ChampionImage { get; set; }

        public ChampionSelectedEventArgs(Image championImage) {
            this.ChampionImage = championImage;
        }
    }

    public event EventHandler<ChampionSelectedEventArgs> ChampionSelected;

    public ChampionSelect() { }

    protected void onChampionSelected(Image im) {
        if(this.ChampionSelected != null)
            this.ChampionSelected(this, new ChampionSelectedEventArgs(im));
    }

    public void icon_slctAce_Click(object sender, EventArgs e) {
        onChampionSelected(Properties.Resources.Ace);
    }
}

public partial class Main : Form {
    private void pictureBox_championSelect_Click(object sender, EventArgs e) {
        ChampionSelect champSlct = new ChampionSelect());
        champSlct.ChampionSelected += this.championSelected;

        champSlct.Show();
    }

    private void championSelected(object sender, ChampionSelectedEventArgs e) {
        this.pictureBox_championSelect.Image = e.ChampionImage;
    }
}

将整个表单传递给ChampionSelect是一种不好的做法,因为您应该为组件提供实现目标所需的最少信息。在这种情况下,ChampionSelect不需要直接访问Main的pictureBox,因为这可能会在以后的开发中引起很大的麻烦(考虑一下如果你决定不再需要一个picturebox或者你想要做一些更复杂的事情会发生什么)。

答案 1 :(得分:0)

这样的事情:

public partial class ChampionSelect : Form
{
    Main champSlct;

    public ChampionSelect(Main main)
    {
        InitializeComponent();
        this.champSlct = main;
    }

    public void icon_slctAce_Click(object sender, EventArgs e)
    {
        champSlct.ChampionSelect = Properties.Resources.Ace;
    }
}

public partial class ChampionSelect : Form
{
    public Image ChampionSelect
    {
        get { return pictureBox_championSelect.Image; }
        set { pictureBox_championSelect.Image = value; }
    }

    private void pictureBox_championSelect_Click(object sender, EventArgs e)
    {
        using (var champSlct = new ChampionSelect(this))
        {
            champSlct.Show();
        }       
    }

    /* ... */
}

其他解决方案可能是您的ChampionSelect可能会有一个公共活动,当选择了一个冠军并且您的主表单可以订阅时,会被解雇。在事件参数中,您可以传递图像。