c# - 复制粘贴 UIElement (FrameworkElement)

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

我有一个设计器VisualStudio WinForms 设计器到底怎么样。

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

实际上,我要为 UIElement 实现复制/粘贴功能。 enter image description here

我将选定的控件放入剪贴板

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

如何从 Clipboard 检索 FrameworkElement 元素?

我尝试仅将元素的名称存储到剪贴板并将其粘贴到记事本中。一切正常。

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

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

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

也许我应该以另一种格式(Serialized 或其他格式)将其存储在 Clipboard

欢迎任何建议。

最佳答案

通过使用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 中。

关于c# - 复制粘贴 UIElement (FrameworkElement),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17486201/

相关文章:

使用带有 SHA256 证书的 ECDSA 进行 C# 签名验证

c# - 使用 C# 获取字段的大小(以字节为单位)

wpf - wpf中的SSRS报告问题

WPF 过多的 PropertyChanged 事件

wpf - WPF 的跟踪栏/ slider 模板

wpf - 在 wpf 中如何处理由使用该用户控件的页面中的用户控件内的按钮引发的事件

c# - 使用 Azure Functions 进行 ILogger 依赖注入(inject)

c# - 使用虚拟属性支持 NHibernate 代理; ReSharper 警告构造函数中的虚拟成员调用

wpf - 根据 bool 值更改边框颜色

WPF:将依赖属性格式化为字符串以显示在文本 block 中的正确方法是什么?