2014-02-27 115 views
0

我的第一個Form = Main和我的第二個Form = ChampionSelect。我打開ChampSelect從這個Form Form通訊

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

然後它打開顯示12個圖標作爲圖片框。

立足現在關閉圖標是什麼人點擊

我希望它在主要改變pictureBox_championSelect圖像到點擊的圖標的形象ChampionSelect

對於防爆:如果你點擊王牌在ChampionSelect圖標應該在主要到Ace.png我已導入資源改變pictureBox_championSelect圖像。

所以,我想這個

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; 

    } 

這是我從另一個崗位上獲悉,但在這裏,它說:「主要是一個‘類型’,但像變量使用」並不起作用。最終,我將根據點擊哪個圖標來更改其他內容,但我認爲它與此類似,所以朝着正確方向的一個點將更有幫助。

回答

3

您可以創建一個在您ChampionSelect形式的活動,從而改變主圖像的處理程序:

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或者想要做更復雜的事情會發生什麼)。

+0

這只是讓我更困惑。 – Marzdor

+0

@Marzdor發生,特別是在第一次;)我剛剛創建了一個事件,很像點擊按鈕和圖片框。事件只不過是一個自定義函數(在這種情況下,Main.championSelected),在必要時被調用(在這種情況下,然後選擇了一個冠軍) – BlackBear

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可以有當選擇一個冠軍一個公共事件嘩嘩被觸發,你的主要形式,可以在此訂閱。在事件參數中,您可以傳遞圖像。