富文本框图像丢弃不显示图像

时间:2012-06-27 21:38:41

标签: c# winforms richtextbox

我有一个简单的页面。一个富文本框绑定到我的数据库中的测试表。

我已将EnableAutoDragDrop变为true。

一切都很好,盒子的内容都会被保存,并且在被要求时能够恢复。

我的问题是将图像丢入RTB。如果我直接从文件管理器(任何类型的图像文件)拖动它们,那么我会得到一个显示文件名的图标,而不是实际图像。

如果我打开Word并将图像放入Word,然后将其拖入RTB,那么图像显示就好了。

我想我不理解文件管理器和word以及RTB之间进程的机制。有谁能让我高兴吗?

2 个答案:

答案 0 :(得分:4)

@climbage提供的答案有很好的解释。这里是如何在RichTextBox中实现拖放

OutPut

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace rich_RichtextboxDragDrop
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AllowDrop = true;
            this.richTextBox1.DragEnter += new DragEventHandler(richTextBox1_DragEnter);
            this.richTextBox1.DragDrop += new DragEventHandler(richTextBox1_DragDrop);
        }
        void richTextBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {

            if ((e.Data.GetDataPresent(DataFormats.FileDrop)))
            {
                e.Effect = DragDropEffects.Copy;
            }
        }
        void richTextBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            Image img = default(Image);
            img = Image.FromFile(((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString());
            Clipboard.SetImage(img);

            this.richTextBox1.SelectionStart = 0;
            this.richTextBox1.Paste();
        }
    }

}

修改了更多信息

这就是你在PropertiesTab中没有看到它的原因。 Attribute [Browsable(false)]告诉PropertyGrid不要显示该属性。这是来自MSDN的代码。

    /// <include file='doc\RichTextBox.uex' path='docs/doc[@for="RichTextBox.DragEnter"]/*' /> 
    /// <devdoc>
    ///     RichTextBox controls have built-in drag and drop support, but AllowDrop, DragEnter, DragDrop 
    ///     may still be used: this should be hidden in the property grid, but not in code
    /// </devdoc>
    [Browsable(false)]
    public new event DragEventHandler DragEnter { 
        add {
            base.DragEnter += value; 
        } 
        remove {
            base.DragEnter -= value; 
        }
    }

答案 1 :(得分:1)

拖动事件可以包含由拖动事件源确定的多种格式类型。当我将图像(.png)从文件系统拖到C#控件时,我会得到这组可用格式(请注意,您可以从DragEventArgs.Data.GetFormats() 获取这些格式)

Shell IDList Array
Shell Object Offsets
DragImageBits
DragContext
InShellDragLoop
FileDrop
FileNameW
FileName

现在当我将相同的图像拖到word上,然后再拖到我的C#控件上时,我得到了这个格式列表:

Woozle
Object Descriptor
Rich Text Format
HTML Format
System.String
UnicodeText
Text
EnhancedMetafile
MetaFilePict
Embed Source

完全由目标控件决定如何处理拖动数据以及使用哪种格式。 MS Word可以采用格式FileNameW,这只是删除文件的路径,并读取图像。虽然RichTextBox可能需要FileNameW并获取其图标。