簡體   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