2013-07-05 125 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