2

I have a Designer exactly how is the VisualStudio WinForms designer.

I drag & drop there controls (FrameworkElements) (from a ToolBox with controls). Controls are stored into a Grid Panel.

Actually I'm going to implement the Copy/Paste functionality for UIElement(s). enter image description here

I put the Selected control to Clipboard

private readonly DataObject _dataObject = new DataObject();

The Copy method it's working OK, it stores the element in Clipboard.

private void CopyUIElementToClipboard(FrameworkElement element) {       
    _dataObject.SetData(element);
    Clipboard.SetDataObject(_dataObject);
}

But on Paste I have problems. I cannot retrieve the element from clipboard.

public void PasteUIElement() {
    var control = _dataObject.GetData(DataFormats.***); //What type should i give it here ?

    //I tried all formats from DataFormats via this. But all returns NULL.
    TryAll();

    //Continue doing other stuff 
}

//Trying all formats inside DataFormats but all return NULL

private void TryAll() {
    var qBitmap = _dataObject.GetData(DataFormats.Bitmap);
    var qCommaSeparatedValue = _dataObject.GetData(DataFormats.CommaSeparatedValue);
    var qDib = _dataObject.GetData(DataFormats.Dib);
    var qEnhancedMetafile = _dataObject.GetData(DataFormats.EnhancedMetafile);
    var qFileDrop = _dataObject.GetData(DataFormats.FileDrop);
    var qHtml = _dataObject.GetData(DataFormats.Html);
    var qLocale = _dataObject.GetData(DataFormats.Locale);
    var qMetafilePicture = _dataObject.GetData(DataFormats.MetafilePicture);
    var qOemText = _dataObject.GetData(DataFormats.OemText);
    var qPalette = _dataObject.GetData(DataFormats.Palette);
    var qPenData = _dataObject.GetData(DataFormats.PenData);
    var qRiff = _dataObject.GetData(DataFormats.Riff);
    var qRtf = _dataObject.GetData(DataFormats.Rtf);
    var qSerializable = _dataObject.GetData(DataFormats.Serializable);
    var qStringFormat = _dataObject.GetData(DataFormats.StringFormat);
    var qSymbolicLink = _dataObject.GetData(DataFormats.SymbolicLink);
    var qText = _dataObject.GetData(DataFormats.Text);
    var qTiff = _dataObject.GetData(DataFormats.Tiff);
    var qUnicodeText = _dataObject.GetData(DataFormats.UnicodeText);
    var qWaveAudio = _dataObject.GetData(DataFormats.WaveAudio);
    var qXaml = _dataObject.GetData(DataFormats.Xaml);
    var qXamlPackage = _dataObject.GetData(DataFormats.XamlPackage);
}

How can I retrieve the FrameworkElement element from Clipboard ?

I tried to store only the name of my element to clipboard and to Paste it in Notepad. It was working fine.

private void CopyUIElementToClipboard(FrameworkElement element) {    
    var elementName = element.Name;
    _dataObject.SetData(DataFormats.Text, elementName, true);

    Clipboard.Clear();
    Clipboard.SetDataObject(_dataObject);
}

But inside my project, how to get things done with Paste, i'm in a little trouble.

Maybe I should store it in Clipboard in another format (Serializable, or something other)

Any suggestion will be welcome.

mihai
  • 2,746
  • 3
  • 35
  • 56

1 Answers1

4

by using the XamlWriter:

var xaml = XamlWriter.Save(element);

I was able to put in Clipboard via:

var xaml = XamlWriter.Save(firstElementOnly);
          _dataObject.SetText(xaml);
Clipboard.SetDataObject(_dataObject);

After that I'm retrieving from Clipboard in this way:

var xamlElement= _dataObject.GetData(DataFormats.Text).ToString();

and with

var xamlString = new StringReader(xamlElement);
var xmlTextReader = new XmlTextReader(xamlString);
var uiElement= (UIElement)XamlReader.Load(xmlTextReader);

I'm transforming it into UIElement.
This way you can store UIElements in Clipboard.

Dave Clemmer
  • 3,741
  • 12
  • 49
  • 72
mihai
  • 2,746
  • 3
  • 35
  • 56
  • link to XamlWriter class: http://msdn.microsoft.com/en-us/library/system.windows.markup.xamlwriter.aspx – mihai Jul 05 '13 at 13:07