Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从剪贴板序列化和反序列化(复制/粘贴)_C#_Wpf - Fatal编程技术网

C# 从剪贴板序列化和反序列化(复制/粘贴)

C# 从剪贴板序列化和反序列化(复制/粘贴),c#,wpf,C#,Wpf,我正在尝试将复制/粘贴功能添加到我的WPF应用程序中。我有一个DataGrid,我允许它选择整行。行是AcquisitionParameters类型的对象。选择正确,复制到剪贴板也正确。复制到剪贴板后,我验证数据是否序列化良好,情况是否如此。但是,当我试图从剪贴板检索对象时,我无法以其原始格式反序列化它,而是以CSV格式 private void dataGridAcquisitions_CopyingRowClipboardContent(object sender, DataGridRowC

我正在尝试将复制/粘贴功能添加到我的WPF应用程序中。我有一个DataGrid,我允许它选择整行。行是AcquisitionParameters类型的对象。选择正确,复制到剪贴板也正确。复制到剪贴板后,我验证数据是否序列化良好,情况是否如此。但是,当我试图从剪贴板检索对象时,我无法以其原始格式反序列化它,而是以CSV格式

private void dataGridAcquisitions_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e)
{
   System.Windows.Clipboard.Clear();
   DataFormat format = System.Windows.DataFormats.GetDataFormat(typeof(AcquisitionParameters).FullName);

   System.Windows.IDataObject dataObj = new System.Windows.DataObject();
   dataObj.SetData(format.Name, (AcquisitionParameters)e.Item, false);
   System.Windows.Clipboard.SetDataObject(dataObj, true);
   bool ispresent = dataObj.GetDataPresent(format.Name); // ok
   AcquisitionParameters parameters = dataObj.GetData(format.Name) as AcquisitionParameters; //ok
   if(parameters != null && ispresent)
   {
      //enter here
   }
}


private void dataGridAcquisitions_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
   if (e.Key == Key.V && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
   {
      System.Windows.IDataObject dataObj = System.Windows.Clipboard.GetDataObject(); //type of AcquisitionParameters not available, only HTML, CSV, etc.
      string format = typeof(AcquisitionParameters).FullName;

      if(dataObj.GetDataPresent(format)) //false
      {
         AcquisitionParameters parameters = dataObj.GetData(format) as AcquisitionParameters;
         if(parameters != null)
         {
         }
      }            
   }
}
以及AcquisitionParameters类的声明

namespace App
{
   [Serializable]
   public class AcquisitionParameters
   {
      private double pulse;
      public double Pulse
      {
         get { return pulse; }
         set { pulse = value; }
      }

      private double range;
      public double Range
      {
         get { return range; }
         set { range = value; }
      }

      private double offset;
      public double Offset
      {
         get { return offset; }
         set { offset = value; }
      }
   }
}

尝试如下方式从剪贴板访问数据:

object data = Clipboard.GetData("AcquisitionParameters");
if (data != null) return (AcquisitionParameters)data;
return new AcquisitionParameters();
DataObject dataObject = new DataObject();
dataObject.SetData("AcquisitionParameters", (AcquisitionParameters)e.Item, false);
Clipboard.SetDataObject(dataObject);
更新>>>

如果没有帮助,请尝试如下设置数据:

object data = Clipboard.GetData("AcquisitionParameters");
if (data != null) return (AcquisitionParameters)data;
return new AcquisitionParameters();
DataObject dataObject = new DataObject();
dataObject.SetData("AcquisitionParameters", (AcquisitionParameters)e.Item, false);
Clipboard.SetDataObject(dataObject);

正如我所说,剪贴板不包含任何自定义格式的数据,只包含DataFormats中的标准格式。。。很遗憾,这段代码和我的没有什么不同。很遗憾,这段代码和我的没有什么不同。。。不嗯,我的工作。毫无疑问,它在您的条件下工作,我建议的版本在某些条件下工作:数据复制到剪贴板之后,但当我尝试在以后用Ctrl+V检索数据时,它失败了。。。