WPF DataGrid复制到剪贴板:如何影响剪贴板中的数据格式?

WPF DataGrid中有一个很好的默认function,它将选定的单元格复制到剪贴板中,所以我们可以在其他应用程序中使用它。 但似乎,复制过程可以在性能方面得到改善,也有某种…错误在粘贴到我假设的Excel中,需要修复。


复制错误的步骤(不正确的Excel使用)

A.1)从WPF数据网格复制单元格,包含带和不带前导零的文本值(例如“001”;“002”;“1”;“12345”;“ABC”;“0ABC”)

A.2)将复制的数据粘贴到Excel中。 可以预料的是,前导零将被保留,但如果可能的话,Excel会将数值转换为数字数据格式(默认情况下,单元格数据types是General,这就是事实)。


复制错误的步骤(正确使用excel)

B.1)从WPF数据网格中复制单元格,包含带和不带前导零的文本值(例如“001”;“002”;“1”;“12345”;“ABC”;“0ABC”)

B.2)select目标excel文件中的所有单元格,并将单元格数据types更改为文本

B.3)将复制的数据粘贴到Excel中。 预计,领先的零将被保留,但他们也没有了


在excel中查看预期结果的步骤(正确使用excel)

C.1)将相同的数据从记事本复制到剪贴板

C.2)select目标excel文件中的所有单元格,并将单元格数据types更改为文本

C.3)将复制的数据粘贴到Excel中。 可以预料的是,领先的零将被保留,现在是真的。 我们可以看到相同的源数据。 所见即所得


我开始研究剪贴板数据,以找出B.1和C.1之间的区别(我也从Excel中复制了相同的数据,并检出了它…)。 我在Microsoft的C#剪贴板查看器示例帮助下发现的:

从记事本++复制的剪贴板数据格式:

- Text (native) - UnicodeText (native) - System.String (autoconvertable) - Locale (native) - OEMText (native) 

剪贴板数据从WPF DataGrid复制的数据格式:

  - HTML Format (native) - Csv (native) - Text (native) - UnicodeText (native) - System.String (autoconvertable) 

剪贴板数据从Excel复制的数据格式:

  - EnhancedMetafile (native) - System.Drawing.Imaging.Metafile (autoconvertable) - MetaFilePict (native) - Bitmap (native) - System.Drawing.Bitmap (autoconvertable) - System.Windows.Media.Imaging.BitmapSource (autoconvertable) - Biff12 (native) - Biff8 (native) - Biff5 (native) - SymbolicLink (native) - DataInterchangeFormat (native) - XML Spreadsheet (native) - HTML Format (native) - Text (native) - UnicodeText (native) - System.String (autoconvertable) - Csv (native) - Hyperlink (native) - Rich Text Format (native) - Embed Source (native) - Object Descriptor (native) - Link Source (native) - Link Source Descriptor (native) - Link (native) - Format129 (native) 

那么步骤B.3中解决问题的最好方法是什么? 我现在想知道2个选项:

选项1

找出向wpf datagrid解释的方法,它需要以特定的格式将数据设置到剪贴板中。

选项#2

第二个select是用我自己的函数来处理Ctrl + C,它将通过选定的单元格运行,在数据网格后面查看,获取正确的数据,追加到string生成器并将文本设置到剪贴板。

您认为上述B.3的最佳解决scheme是什么?

好。 所以,因为我正在讨论从WPF DataGrid复制到剪贴板…我研究了datagrid的源代码(我应该提出这个想法,而不是问这个问题。)

所以,源代码复制的一部分处理程序是:

  // Supported default formats: Html, Text, UnicodeText and CSV Collection<string> formats = new Collection<string>(new string[] { DataFormats.Html, DataFormats.Text, DataFormats.UnicodeText, DataFormats.CommaSeparatedValue }); 

所以简单的答案是:选项#1是不可能的(换句话说,剪贴板的sinse数据格式是硬编码的 – 没有可能影响)。 选项#2是好的。 但是现在我认为inheritancedatagrid和override方法是有意义的

  protected virtual void OnExecutedCopy(ExecutedRoutedEventArgs args) 

这会给我所有情况的很好的解决scheme。