谁拥有放在剪贴板上的MemoryStream对象?(或者应该使用除MemoryStream之外的东西?)

Bil*_*eal 8 c# wpf clipboard memorystream

我有这样的方法:

public DataObject GetClipboardData()
{
    var result = new DataObject();
    result.SetText(this.fallbackText.ToString());
    result.SetData(DataFormats.Html, this.GenerateHtml(), false);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

哪里GenerateHtml返回一个MemoryStream.

我是否需要担心关闭MemoryStream物体?或者我应该使用其他类型的对象将原始字节放在剪贴板上?

(我试过,byte[]但这会将文字"System.Byte[]"或类似文字放在剪贴板上)

gia*_*min 1

我认为,如果一个对象实现了,那么IDisposable当您不再需要它时将其丢弃是一件好事。

DataObject提供了该接口的基本实现IDataObject,那么为什么不从它派生:

public sealed class HtmlDataObject : DataObject, IDisposable
{
    protected MemoryStream HtmlMemoryStream { get; set; }

    public HtmlDataObject(MemoryStream memoryStream, string fallBackText)
    {
        HtmlMemoryStream = memoryStream;
        SetText(fallBackText);
        SetData(DataFormats.Html, false, HtmlMemoryStream );
    }
    public void Dispose()
    {
        HtmlMemoryStream .Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你的方法可以改变:

public HtmlDataObject GetClipboardData()
{
    return new HtmlDataObject(this.GenerateHtml(), this.fallbackText.ToString());
}
Run Code Online (Sandbox Code Playgroud)

当你使用完它后,你可以将它放入using statementor it 中。Dispose()

最后的想法:您不应该担心剪贴板数据,因为DataObject当您退出应用程序时,无论如何它们都会被破坏,并且您的剪贴板将丢失您放入其中的内容。 http://msdn.microsoft.com/en-us/library/office/gg278673.aspx

如果您希望在处理流后和/或应用程序退出时保留该流,则必须使用带有参数 =的Clipboard.SetDataObjectcopytrue