Перетаскивание изображения в FlowDocument внутри RichTextBox во время выполнения - PullRequest
3 голосов
/ 28 января 2012

Я пытаюсь создать редактор в WPF 3.5.Функциональность, с которой у меня возникают трудности: я хочу, чтобы пользователь перетаскивал изображения из ListBox, содержащие Image объекты, в текстовый редактор.

Я прочитал msdnдокументы об использовании FlowDocument внутри RichTextBox внутри ScrollViewer, который я использую для редактора:

<ScrollViewer>
    <RichTextBox>
        <FlowDocument AllowDrop="True" Drop="FlowDocument_Drop" DragOver="FlowDocument_DragOver">

        </FlowDocument>
    </RichTextBox>
</ScrollViewer>

У меня есть тестовый Image элемент управления для имитации того, чтоЯ намереваюсь вставить ListBox:

<Image Grid.Row="0" Name="img" Source="test.png"
           MouseMove="img_MouseMove" />

Код выглядит следующим образом:

    private void img_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            DragDrop.DoDragDrop(sender as DependencyObject,
                new DataObject("ImageSource", (sender as Image).Source), DragDropEffects.Copy);
        }
    }

    private void FlowDocument_Drop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent("ImageSource"))
        {
            ImageSource img = (ImageSource)e.Data.GetData("ImageSource");

            (sender as FlowDocument).Blocks.Add(new BlockUIContainer(new Image() { Source = img }));
        }
    }

    private void FlowDocument_DragOver(object sender, DragEventArgs e)
    {
        e.Effects = DragDropEffects.Copy;

        if (e.Data.GetDataPresent("ImageSource"))
        {
            e.Effects = DragDropEffects.Copy | DragDropEffects.Move;
        }
    }

Моя проблема в том, что метод FlowDocument_Drop никогда не выполняется и когда изображениеперетаскивается над FlowDocument, курсор все еще показывает, что перетаскивание недоступно.

Я не понимаю, почему событие не запускается.

1 Ответ

3 голосов
/ 28 января 2012

Вы должны сообщить событию DragOver, что оно обрабатывается и не направляется дочерним элементам.

if (e.Data.GetDataPresent("ImageSource")) {
    e.Effects = DragDropEffects.Copy;
    e.Handled = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...