C # .NET 4.0 Перетаскивание между двумя приложениями

1

Поэтому мне бы очень хотелось перетащить данные между двумя экземплярами приложения; однако, если есть данные, присутствующие в целевой точке, где я падаю, я хотел бы обменять эти данные на то, что отбрасывается.

Я пытаюсь использовать 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;
        }
    }
Теги:
drag-and-drop

1 ответ

1

Две возможные попытки попробовать

Переместите вызов на pb.DoDragDrop(data, DragDropEffects.Move); после создания файла с отображением памяти. Это вызовет задержку начала действия перетаскивания/перетаскивания, но должно гарантировать, что данные были записаны в файл.

Другой альтернативой является запись данных в mmf в отдельный поток и их установка и Событие, когда данные записываются. Затем pbSprite_DragDrop может дождаться, пока событие будет передано перед чтением из файла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню