繁体   English   中英

如何将元组复制到剪贴板

[英]How to copy Tuples to clipboard

我必须将三个不同的数据复制到剪贴板。 所以我创建了一个元组并将其复制到剪贴板,然后将其复制到剪贴板

var newTuple = new Tuple<Component, Color?, bool?>(CopyComponent, headerColour_Copied, IsHeaderForegroundDark_Copied);
Clipboard.SetDataObject(newTuple);

复制时出现异常,翻译后可能听起来像“其他数据可用”。 我也试图清除剪贴板,但这没有帮助。

Clipboard.SetDataObject(CopyComponent);
Clipboard.SetDataObject(headerColour_Copied);
Clipboard.SetDataObject(IsHeaderForegroundDark_Copied);

请注意,如果我不制作元组而是分别设置每个数据,一切都很好。

那么元组不能复制到剪贴板吗?

我还尝试将三个数据中的每一个都装箱到 object 中,但仍然失败

感谢您的帮助

帕特里克

泛型类型通常在 realm 之外不能很好地发挥作用。 网; 尝试发送一个普通的值数组:

Clipboard.SetDataObject(new object[] { CopyComponent, headerColour_Copied, IsHeaderForegroundDark_Copied });

剪贴板内容可以被任何应用程序使用; 基本的内在类型在这里是更安全的选择。

幸运的是,我们可以将ValueTupleTuple存储在剪贴板上,并将其作为可序列化数据 object 检索。

// using System.Windows;
public void TupleClipboardTest1()
{
    (int, string) original = (11, "Eleven");

    Clipboard.SetData(DataFormats.Serializable, original);

    object retrieved = Clipboard.GetData(DataFormats.Serializable);

    Debug.WriteLine(retrieved.GetType()); // System.ValueTuple`2[System.Int32,System.String]

    (int, string) restored = (ValueTuple<int, string>)retrieved;

    Debug.WriteLine(restored.Item1); // 11
    Debug.WriteLine(restored.Item2); // Eleven
}
// using System.Windows;
public void TupleClipboardTest2()
{
    Tuple<int, string> original = (11, "Eleven").ToTuple();

    Clipboard.SetData(DataFormats.Serializable, original);

    object retrieved = Clipboard.GetData(DataFormats.Serializable);

    Debug.WriteLine(retrieved.GetType()); // System.Tuple`2[System.Int32, System.String]

    Tuple<int, string> restored = (Tuple<int, string>)retrieved;

    Debug.WriteLine(restored.Item1); // 11
    Debug.WriteLine(restored.Item2); // Eleven
}

当然,它的项目也必须是可序列化的。 否则会导致 COMException。

// using System.Windows;
public void TupleClipboardTest3()
{
    (int, System.Windows.Media.Color) original = (11, System.Windows.Media.Colors.Gray);

    Clipboard.SetData(DataFormats.Serializable, original);

    object retrieved = Clipboard.GetData(DataFormats.Serializable); // System.Runtime.InteropServices.COMException: 'Data on clipboard is invalid (0x800401D3 (CLIPBRD_E_BAD_DATA))'
}

因此,我们需要预先将不可序列化的项目转换为可序列化的 object。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM