【问题标题】:Serialization and deserialization from clipboard (copy/paste)从剪贴板进行序列化和反序列化(复制/粘贴)
【发布时间】:2015-02-10 16:40:24
【问题描述】:

我正在尝试向我的 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; }
      }
   }
}

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    尝试像这样从Clipboard 访问数据:

    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 检索它时它失败了。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多