簡體   English   中英

C#.NET 4.0在兩個應用程序之間的拖放

[英]C# .NET 4.0 Drag and drop between two applications

因此,我真的很想在一個應用程序的兩個實例之間拖放數據。 但是,如果在我要刪除的目標點上存在數據,我想將該數據與要刪除的數據交換。

我正在嘗試使用MemoryMappedFIle,這似乎在大多數情況下都有效,但這並不完美。 例如,如果我拖放得太快,目標數據將被簡單地覆蓋(我假設它沒有足夠快地寫入MemoryMappedFile中)。 有人有任何建議嗎?

這是我目前擁有的:

    private void pbSprite_MouseDown(object sender, MouseEventArgs e)
    {
        PictureBox pb = (PictureBox)(sender);
        DataObject data = new DataObject();
        if (pb.Name == pbSprite.Name)
        {
            data = new DataObject(DataFormats.Serializable, frmpkm);
        }
        else
        {
            data = new DataObject(DataFormats.Serializable, frmpkm2);
        }
        pb.DoDragDrop(data, DragDropEffects.Move);
        MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen("name", 1000, MemoryMappedFileAccess.ReadWrite);
        using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor())
        {
            PKMDS.Pokemon otherpkm = new PKMDS.Pokemon();
            for (int i = 0; i < Marshal.SizeOf(otherpkm); i++)
            {
                FileMap.Read<byte>(i, out otherpkm.Data[i]);
            }
            if (pb.Name == pbSprite.Name)
            {
                frmpkm.Data = otherpkm.Data;
            }
            else
            {
                frmpkm2.Data = otherpkm.Data;
            }
            lblData.Text = frmpkm.SpeciesName;
            lblData2.Text = frmpkm2.SpeciesName;
            pbSprite.Image = frmpkm.Sprite;
            pbSprite2.Image = frmpkm2.Sprite;
        }
    }
    private void pbSprite_DragDrop(object sender, DragEventArgs e)
    {
        if (e.Data != null)
        {
            PictureBox pb = (PictureBox)(sender);
            PKMDS.Pokemon otherpkm = (PKMDS.Pokemon)e.Data.GetData(DataFormats.Serializable);
            MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen("name", 1000, MemoryMappedFileAccess.ReadWrite);
            using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor())
            {
                for (int i = 0; i < Marshal.SizeOf(frmpkm); i++)
                {
                    if (pb.Name == pbSprite.Name)
                    {
                        FileMap.Write<byte>(i, ref frmpkm.Data[i]);
                    }
                    else
                    {
                        FileMap.Write<byte>(i, ref frmpkm2.Data[i]);
                    }
                }
            }
            if (pb.Name == pbSprite.Name)
            {
                frmpkm.Data = otherpkm.Data;
            }
            else
            {
                frmpkm2.Data = otherpkm.Data;
            }
            lblData.Text = frmpkm.SpeciesName;
            lblData2.Text = frmpkm2.SpeciesName;
            pbSprite.Image = frmpkm.Sprite;
            pbSprite2.Image = frmpkm2.Sprite;
        }
    }

兩種可能的嘗試

將調用移到pb.DoDragDrop(data, DragDropEffects.Move); 創建內存映射文件后。 這將導致開始拖放操作的延遲,但應確保已將數據寫入文件。

另一種選擇是在單獨的線程中將數據寫入mmf,並在寫入數據時將其設置為Event。 然后, pbSprite_DragDrop可以等待事件被信號通知,然后再從文件中讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM