如何在c#中通过拖放在面板中传递背景色

本文关键字:背景色 拖放 | 更新日期: 2023-09-27 17:49:22

我们有这个学校项目,我们需要c#中的程序Mastermind。我们用面板将颜色形象化。因此,我们在顶部有行availblecolors,以及x-number行面板来猜测代码。其中X为圈数。

我们需要实现一个拖放事件,用户将其中一个可用的颜色拖到猜测行的面板上。例如,用户单击并将红色拖动到行中的一个面板上,那么该面板的背景色需要更改为红色。

这是我目前所拥有的:

#region CreatePanels
    public void CreatePanelArrayColors(int aantalKleuren) 
    {
        pa = new Panel[aantalKleuren];
        for (int i = 0; i < pa.Length; i++) {
            pa[i] = new Panel();
            pa[i].Width = 40;
            pa[i].Height = 40;
            pa[i].Top = 18;
            pa[i].Left = 6 + i * 46;
            pa[i].Tag = i;
            pa[i].MouseDown += paAC_MouseDown;

            kleurenToewijzen(pa, (int)pa[i].Tag, i);
            grpAvailColors.Controls.Add(pa[i]);
        }
    }
    public void CreatePanelGuess(int nmbrColorsToGuess)
    {
        pa = new Panel[nmbrColorsToGuess];
        for (rowNumber = 0; rowNumber < g.Turns; rowNumber++)
        {
            for (j = 0; j < pa.Length; j++)
            {
                pa[j] = new Panel();
                pa[j].Width = 30;
                pa[j].Height = 30;
                pa[j].Top = (rowNumber * 30 + rowNumber * 3) + 3;
                pa[j].Left = 3 + j * 36;
                pa[j].BackColor = Color.LightGray;
                pa[j].AllowDrop = true;
                pa[j].DragEnter += paTG_DragEnter;
                pa[j].DragDrop += paTG_DragDrop;
                ActieveTeRadenRij(pa, j, rowNumber);
                pnlColorsToGuess.Controls.Add(pa[j]);
            }
            for (int correctie = 0; correctie < pa.Length; correctie++)
            {
                pa[correctie] = new Panel();
                pa[correctie].Width = 10;
                pa[correctie].Height = 10;
                pa[correctie].Top = (rowNumber * 30 + rowNumber * 3) + 30 / 2 - 1;
                pa[correctie].Left = (3 + g.ColorsGuess * 36) + 10 + correctie * 18;
                pa[correctie].BackColor = Color.Gray;
                pa[correctie].AllowDrop = true;
                pa[correctie].DragEnter += paTG_DragEnter;
                pa[correctie].DragDrop += paTG_DragDrop;
                pnlColorsToGuess.Controls.Add(pa[correctie]);
            }
            //bt[0] = new Button();
            //bt[0].Top = (rowNumber * 50 + rowNumber * 3) + 50 / 2;
            //bt[0].Left = (3 + g.ColorsGuess * 56) + 10 + g.ColorsGuess * 18 + 10;
            //pnlColorsToGuess.Controls.Add(bt[0]);
        }
        CreateTryButton();
    }
    #region DragAndDrop
    private void paTG_DragDrop(object sender, DragEventArgs e)
    {
        ((Panel)e.Data.GetData(typeof(Panel))).Parent = (Panel)sender;
    }
    private void paTG_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }
    private void paAC_MouseDown(object sender, MouseEventArgs e)
    {
        Panel pnl = sender as Panel;
        pnl.DoDragDrop(pnl, DragDropEffects.Move);
    }
    #endregion

问题是,当我们拖动面板的一行,这个面板消失了,颜色没有改变。

如何在c#中通过拖放在面板中传递背景色

试着这样做:

private void paTG_DragDrop(object sender, DragEventArgs e)
{
    var data = e.Data.GetData(typeof(Color));
    if(data != null)
        ((Panel)sender).BackColor = (Color)data;
}
private void paAC_MouseDown(object sender, MouseEventArgs e)
{
    Panel pnl = sender as Panel;
    if(pnl != null)
        pnl.DoDragDrop(pnl.BackColor, DragDropEffects.Move);
}

与您的代码比较的差异如下:

  • 我在paTG_DragDrop方法中使用Panel类的BackColor属性来改变其颜色。
  • 我使用Color作为数据拖动。
  • 我假设源面板的BackColor属性填充了适当的颜色。如果你有不同的方法,它可以很容易地改变。