2012-01-28 37 views
3

我試圖在WPF 3.5中創建一個編輯器。我遇到的困難是:我希望用戶將包含Image對象的ListBox中的圖像拖放到文本編輯器中。在運行時將圖像拖動到RichTextBox中的FlowDocument中

我讀過msdn docs有關使用FlowDocument一個RichTextBoxScrollViewer裏,我使用了編輯器,其中:

<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時,光標仍然顯示拖動不可用。

我不明白爲什麼事件不會觸發。

回答

3

你必須告訴DragOver事件它被處理並且不被路由到兒童。

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