我有一个设计器,VisualStudio
WinForms
设计器到底怎么样。
我将控件(FrameworkElements
)拖放到那里(从带有控件的工具箱)。
控件存储在 Grid
Panel
中。
实际上,我要为 UIElement
实现复制/粘贴功能。
我将选定的控件放入剪贴板
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/