C# 避免拖放闪烁的正确方法

C# 避免拖放闪烁的正确方法,c#,drag-and-drop,picturebox,flicker,C#,Drag And Drop,Picturebox,Flicker,今天我整天都在搜索论坛和堆栈溢出,试图找出正确的方法来消除在我的表单面板上拖动图像图片框时令人讨厌的闪烁。我正试图复制一个纸牌游戏,让我和我的朋友能够在家里玩。我从Picturebox类派生,以便可以向对象添加一些附加属性。下面是该类的代码: class Card : PictureBox { public string CardId { get; set; } public string CardName { get; set; } public string

今天我整天都在搜索论坛和堆栈溢出,试图找出正确的方法来消除在我的表单面板上拖动图像图片框时令人讨厌的闪烁。我正试图复制一个纸牌游戏,让我和我的朋友能够在家里玩。我从Picturebox类派生,以便可以向对象添加一些附加属性。下面是该类的代码:

    class Card : PictureBox 
{
    public string CardId { get; set; }
    public string CardName { get; set; }
    public string CardColor { get; set; }
    public string CardType { get; set; }
    public string CardRarity { get; set; }
    public bool Tapped { get; set; }
    public bool Revealed { get; set; }        
}
我有一个面板设置,当玩家双击手中的一张牌时,它会将其添加到面板中。然后我设置了一个拖放,这样他们就可以在面板上移动卡片了。这是代码

    int posX;
    int posY;

    private void DragCard(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            dragging = true;
            posX = e.X;
            posY = e.Y;
        }
    }
    private void isDragging(object sender, MouseEventArgs e)
    {
        if (dragging == true)
        {               
            ((Card)sender).Left += e.X - posX;
            ((Card)sender).Top += e.Y - posY;               
            ((Card)sender).BringToFront();                
        }
    }
    private void DoneDrag(object sender, MouseEventArgs e)
    {
        dragging = false;
    }        
问题是,我在面板中有一个背景图像,所以当卡移动时,它会显示一条从移动前的原始位置开始的轨迹。我找了又找,看到了这么多不同的方法来摆脱这个,但似乎没有什么对我有效。如果有人能用最蹩脚的术语解释,我将不胜感激,因为我对编码非常陌生。非常感谢你的帮助。为了防止遗漏任何内容,我添加了以下代码的其余部分:

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    List<Card> PlayerDeck = new List<Card>();
    Card curCard;
    bool dragging = false;
    int posX;
    int posY;

    private void DragCard(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            dragging = true;
            posX = e.X;
            posY = e.Y;
        }
    }
    private void isDragging(object sender, MouseEventArgs e)
    {
        if (dragging == true)
        {               
            ((Card)sender).Left += e.X - posX;
            ((Card)sender).Top += e.Y - posY;               
            ((Card)sender).BringToFront();                
        }
    }
    private void DoneDrag(object sender, MouseEventArgs e)
    {
        dragging = false;
    }        

    private void Form1_Load(object sender, EventArgs e)
    {
        btnLoadDeck.Enabled = true;
        btnShuffle.Enabled = true;
        numericHealth.Value = 20;
        numericHealth.Enabled = false;
        cardDeck.Enabled = true;
        cardGrave.Enabled = false;
        listStatus.Enabled = true;           
    }
    private void btnLoadDeck_Click(object sender, EventArgs e)
    {
        if (PlayerDeck.Count > 0)
        {
            MessageBox.Show("Deck Already Loaded...");
            return;
        }

        int x = 0;
        foreach (Card c in Deck.LoadDeck())
        {
            Card c1 = new Card();
            c1.CardId = c.CardId;
            c1.CardName = c.CardName;
            c1.CardColor = c.CardColor;
            c1.CardType = c.CardType;
            c1.CardRarity = c.CardRarity;
            c1.Size = new Size(100, 120);
            c1.Location = new Point(0, 0);
            c1.SizeMode = PictureBoxSizeMode.StretchImage;                
            c1.BorderStyle = BorderStyle.Fixed3D;
            c1.BackColor = Color.Black;
            c1.ContextMenuStrip = conMenuHand;
            c1.Image = Image.FromFile(@"C:\Users\vildez\Desktop\Virtual Magic\Cards\c72b2bb7-e6da-49bb-9bd5-a538db0761ee\Cards\" + c.CardId + ".jpg");
            c1.Name = "Card" + x.ToString();
            c1.MouseEnter += ViewCard;
            c1.DoubleClick += c1_DoubleClick;
            PlayerDeck.Add(c1);
            x++;  
        }
    }

    void c1_DoubleClick(object sender, EventArgs e)
    {
        PlayCard(sender,null);
    }

    void ViewCard(object sender, EventArgs e)
    {
        cardViewer.Image = Image.FromFile(@"C:\Users\vildez\Desktop\Virtual Magic\Cards\c72b2bb7-e6da-49bb-9bd5-a538db0761ee\Cards\" + ((Card)sender).CardId + ".jpg");
    }

    private void cardDeck_Click(object sender, EventArgs e)
    {            
        for (int i = 0; i < 10; i++)
        {
            panelHand.Controls.Add(PlayerDeck[0]);
            PlayerDeck.RemoveAt(0);
        }            
    }

    public void PlayCard(object sender, EventArgs e)
    {
        panelHand.Controls.Remove(((Card)sender));

        Card c1 = new Card();
        c1.CardId = ((Card)sender).CardId;
        c1.CardName = ((Card)sender).CardName;
        c1.CardColor = ((Card)sender).CardColor;
        c1.CardType = ((Card)sender).CardType;
        c1.CardRarity = ((Card)sender).CardRarity;
        c1.Size = new Size(50, 70);
        c1.SizeMode = PictureBoxSizeMode.StretchImage;
        c1.BorderStyle = BorderStyle.Fixed3D;
        c1.BackColor = Color.Black;
        c1.Location = new Point(10, 10);
        c1.Image = Image.FromFile(@"C:\Users\vildez\Desktop\Virtual Magic\Cards\c72b2bb7-e6da-49bb-9bd5-a538db0761ee\Cards\" + c1.CardId + ".jpg");
        c1.MouseDown += new MouseEventHandler(DragCard);
        c1.MouseMove += new MouseEventHandler(isDragging);
        c1.MouseUp += new MouseEventHandler(DoneDrag);
        c1.MouseEnter += new EventHandler(ViewCard);

        int x = 0;
        for (int i = 0; i < panelPlayer.Width; i++)
        {
            if (i + 50 > panelHand.Width)
            {
                i = 0;
                x += 70 + 1;
            }

            if (panelPlayer.GetChildAtPoint(new Point(i, x)) == null)
            {
                c1.Location = new Point(i, x);
                panelPlayer.Controls.Add(c1);                    
                break;
            }
        }
    }
    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
        curCard = ((ContextMenuStrip)sender).SourceControl as Card;
    }

    private void tsMenuItemPlayCard_Click(object sender, EventArgs e)
    {
        PlayCard(curCard, null);
    }

    private void panelPlayer_Paint(object sender, PaintEventArgs e)
    {

    }

}
}