首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制粘贴UIElement (FrameworkElement)

复制粘贴UIElement (FrameworkElement)
EN

Stack Overflow用户
提问于 2013-07-05 10:04:49
回答 1查看 2.1K关注 0票数 2

我有一个 designer VisualStudio WinForms designer到底是怎样的。

我在那里拖放控件(FrameworkElements) (从带有控件的ToolBox中)。控件存储在Grid Panel中。

实际上,我将为(S)实现复制/粘贴功能。

我将选定的控件放到Clipboard

代码语言:javascript
复制
private readonly DataObject _dataObject = new DataObject();

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

代码语言:javascript
复制
private void CopyUIElementToClipboard(FrameworkElement element) {       
    _dataObject.SetData(element);
    Clipboard.SetDataObject(_dataObject);
}

但在粘贴上,我遇到了问题。我无法从剪贴板中检索元素。

代码语言:javascript
复制
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

代码语言:javascript
复制
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元素?

我试图只将元素的名称存储到剪贴板上,并将其粘贴到记事本中。一切都很顺利。

代码语言:javascript
复制
private void CopyUIElementToClipboard(FrameworkElement element) {    
    var elementName = element.Name;
    _dataObject.SetData(DataFormats.Text, elementName, true);

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

但是在我的项目中,如何使用粘贴来完成任务,我遇到了一些小麻烦。

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

任何建议都将受到欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-05 12:58:43

通过使用XamlWriter

代码语言:javascript
复制
var xaml = XamlWriter.Save(element);

我可以在剪贴板上:

代码语言:javascript
复制
var xaml = XamlWriter.Save(firstElementOnly);
          _dataObject.SetText(xaml);
Clipboard.SetDataObject(_dataObject);

之后,我将以这样的方式从Clipboard检索:

代码语言:javascript
复制
var xamlElement= _dataObject.GetData(DataFormats.Text).ToString();

并使用

代码语言:javascript
复制
var xamlString = new StringReader(xamlElement);
var xmlTextReader = new XmlTextReader(xamlString);
var uiElement= (UIElement)XamlReader.Load(xmlTextReader);

我要把它转换成UIElement

这样,您就可以将UIElements存储在Clipboard中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17486201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档