如何在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
问题是,当我们拖动面板的一行,这个面板消失了,颜色没有改变。
试着这样做:
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
属性填充了适当的颜色。如果你有不同的方法,它可以很容易地改变。