复制粘贴UIElement(FrameworkElement)

时间:2013-07-05 10:04:49

标签: c# wpf wpf-controls clipboard copy-paste

我有一个 Designer VisualStudio WinForms设计师到底是怎样的。

我拖着&放下控件(FrameworkElements)(来自带控件的工具箱)。 控件存储在Grid Panel

实际上我将为UIElement实施复制/粘贴功能。 enter image description here

我将Selected控件放到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);
}

如何从FrameworkElement中检索Clipboard元素?

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

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

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

但在我的项目中,如何使用粘贴完成工作,我有点麻烦。

也许我应该以{{1​​}}以其他格式(Clipboard或其他格式)将其存储在<{p}}

欢迎任何建议。

1 个答案:

答案 0 :(得分: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存储在Clipboard