2

我有一个设计师,设计师到底怎么样VisualStudio WinForms

我将控件 ( ) 拖放到那里FrameworkElements(来自带有控件的工具箱)。控件存储在Grid Panel.

实际上,我将为(s) 实现复制/粘贴功能。UIElement在此处输入图像描述

我把 Selected 控件放到Clipboard

private readonly DataObject _dataObject = new DataObject();

Copy方法工作正常,它将元素存储在剪贴板中。

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);
}

但是在我的项目中,如何使用Paste完成工作,我遇到了一些麻烦。

也许我应该Clipboard以另一种格式(Serializable或其他格式)存储它

任何建议都将受到欢迎。

4

1 回答 1

4

通过使用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.
这样您就可以将UIElements 存储在Clipboard.

于 2013-07-05T12:58:43.967 回答