2013-07-05 129 views
1

我有一个设计师究竟是如何设计的VisualStudioWinForms复制粘贴UIElement(FrameworkElement)

我拖动&下降控制(FrameworkElements)(从工具箱与控件)。控制器存储在GridPanel中。

其实我要为UIElement(s)实现复制/粘贴功能。 enter image description here

我把选定的控制Clipboard

private readonly DataObject _dataObject = new DataObject(); 

复制方法它的工作好,它存储在剪贴板中的元素。

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

但在粘贴我有问题。我无法从剪贴板中检索元素。

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 
} 

//试图里面DataFormats所有格式,但都返回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); 
} 

我怎样才能检索ClipboardFrameworkElement元素?

我试图只将我的元素的名称存储到剪贴板并将其粘贴到记事本中。它工作正常。

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

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

但我的项目中,如何让事情粘贴做,我在一个小麻烦。

也许我应该以另一种格式(Serializable,或其他东西)

任何建议将受到欢迎它存储在Clipboard

回答

3

使用XamlWriter

var xaml = XamlWriter.Save(element); 

我能够把剪贴板通过:

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

在那之后,我从Clipboard检索这样:

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

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

我正在将它转换为UIElement
这样,您可以将UIElement s存储在Clipboard中。

+0

链接到XamlWriter类:http:// msdn。microsoft.com/en-us/library/system.windows.markup.xamlwriter.aspx – meorfi