public bool Copy(bool run = true) { if (_selectedShapes.Count == 0) { return(false); } if (run) { var buf = SerializeSelected(); var data = new DataObject(); data.SetData("DiagramDocument", buf.ToArray()); var sortedShapes = _selectedShapes.OrderBy(s => { var c = s.BBox.Center(); return(c.Y + c.X / 10); }); var text = StringExt.Join("\n\n", sortedShapes .Select(s => s.PlainText()).Where(t => !string.IsNullOrEmpty(t))); if (!string.IsNullOrEmpty(text)) { data.SetText(text); } // Crazy Clipboard deletes data by default on app exit! // need 'true' parameter to prevent loss of data on exit Clipboard.SetDataObject(data, true); } return(true); }