SampleDataTransferPage.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System; 6 using System.Globalization; 7 using Microsoft.CommandPalette.Extensions; 8 using Microsoft.CommandPalette.Extensions.Toolkit; 9 using Windows.ApplicationModel.DataTransfer; 10 using Windows.Storage.Streams; 11 12 namespace SamplePagesExtension; 13 14 internal sealed partial class SampleDataTransferPage : ListPage 15 { 16 private readonly IListItem[] _items; 17 18 public SampleDataTransferPage() 19 { 20 var dataPackageWithText = CreateDataPackageWithText(); 21 var dataPackageWithDelayedText = CreateDataPackageWithDelayedText(); 22 var dataPackageWithImage = CreateDataPackageWithImage(); 23 24 _items = 25 [ 26 new ListItem(new NoOpCommand()) 27 { 28 Title = "Draggable item with a plain text", 29 Subtitle = "A sample page demonstrating how to drag and drop data", 30 DataPackage = dataPackageWithText, 31 }, 32 new ListItem(new NoOpCommand()) 33 { 34 Title = "Draggable item with a lazily rendered plain text", 35 Subtitle = "A sample page demonstrating how to drag and drop data with delayed rendering", 36 DataPackage = dataPackageWithDelayedText, 37 }, 38 new ListItem(new NoOpCommand()) 39 { 40 Title = "Draggable item with an image", 41 Subtitle = "This item has an image - package contains both file and a bitmap", 42 Icon = IconHelpers.FromRelativePath("Assets/Images/Swirls.png"), 43 DataPackage = dataPackageWithImage, 44 }, 45 new ListItem(new SampleDataTransferOnGridPage()) 46 { 47 Title = "Drag & drop grid", 48 Subtitle = "A sample page demonstrating a grid list of items", 49 Icon = new IconInfo("\uF0E2"), 50 } 51 ]; 52 } 53 54 private static DataPackage CreateDataPackageWithText() 55 { 56 var dataPackageWithText = new DataPackage 57 { 58 Properties = 59 { 60 Title = "Item with data package with text", 61 Description = "This item has associated text with it", 62 }, 63 RequestedOperation = DataPackageOperation.Copy, 64 }; 65 dataPackageWithText.SetText("Text data in the Data Package"); 66 return dataPackageWithText; 67 } 68 69 private static DataPackage CreateDataPackageWithDelayedText() 70 { 71 var dataPackageWithDelayedText = new DataPackage 72 { 73 Properties = 74 { 75 Title = "Item with delayed render data in the data package", 76 Description = "This items has an item associated with it that is evaluated when requested for the first time", 77 }, 78 RequestedOperation = DataPackageOperation.Copy, 79 }; 80 dataPackageWithDelayedText.SetDataProvider(StandardDataFormats.Text, request => 81 { 82 var d = request.GetDeferral(); 83 try 84 { 85 request.SetData(DateTime.Now.ToString("G", CultureInfo.CurrentCulture)); 86 } 87 finally 88 { 89 d.Complete(); 90 } 91 }); 92 return dataPackageWithDelayedText; 93 } 94 95 private static DataPackage CreateDataPackageWithImage() 96 { 97 var dataPackageWithImage = new DataPackage 98 { 99 Properties = 100 { 101 Title = "Item with delayed render image in the data package", 102 Description = "This items has an image associated with it that is evaluated when requested for the first time", 103 }, 104 RequestedOperation = DataPackageOperation.Copy, 105 }; 106 dataPackageWithImage.SetDataProvider(StandardDataFormats.Bitmap, async void (request) => 107 { 108 var deferral = request.GetDeferral(); 109 try 110 { 111 var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Images/Swirls.png")); 112 var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 113 var streamRef = RandomAccessStreamReference.CreateFromStream(stream); 114 request.SetData(streamRef); 115 } 116 finally 117 { 118 deferral.Complete(); 119 } 120 }); 121 dataPackageWithImage.SetDataProvider(StandardDataFormats.StorageItems, async void (request) => 122 { 123 var deferral = request.GetDeferral(); 124 try 125 { 126 var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Images/Swirls.png")); 127 var items = new[] { file }; 128 request.SetData(items); 129 } 130 finally 131 { 132 deferral.Complete(); 133 } 134 }); 135 return dataPackageWithImage; 136 } 137 138 public override IListItem[] GetItems() => _items; 139 } 140 141 [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "Samples")] 142 internal sealed partial class SampleDataTransferOnGridPage : ListPage 143 { 144 public SampleDataTransferOnGridPage() 145 { 146 GridProperties = new GalleryGridLayout 147 { 148 ShowTitle = true, 149 ShowSubtitle = true, 150 }; 151 } 152 153 public override IListItem[] GetItems() 154 { 155 return [ 156 new ListItem(new NoOpCommand()) 157 { 158 Title = "Red Rectangle", 159 Subtitle = "Drag me", 160 Icon = IconHelpers.FromRelativePath("Assets/Images/RedRectangle.png"), 161 DataPackage = CreateDataPackageForImage("Assets/Images/RedRectangle.png"), 162 }, 163 new ListItem(new NoOpCommand()) 164 { 165 Title = "Swirls", 166 Subtitle = "Drop me", 167 Icon = IconHelpers.FromRelativePath("Assets/Images/Swirls.png"), 168 DataPackage = CreateDataPackageForImage("Assets/Images/Swirls.png"), 169 }, 170 new ListItem(new NoOpCommand()) 171 { 172 Title = "Windows Digital", 173 Subtitle = "Drag me", 174 Icon = IconHelpers.FromRelativePath("Assets/Images/Win-Digital.png"), 175 DataPackage = CreateDataPackageForImage("Assets/Images/Win-Digital.png"), 176 }, 177 new ListItem(new NoOpCommand()) 178 { 179 Title = "Red Rectangle", 180 Subtitle = "Drop me", 181 Icon = IconHelpers.FromRelativePath("Assets/Images/RedRectangle.png"), 182 DataPackage = CreateDataPackageForImage("Assets/Images/RedRectangle.png"), 183 }, 184 new ListItem(new NoOpCommand()) 185 { 186 Title = "Space", 187 Subtitle = "Drag me", 188 Icon = IconHelpers.FromRelativePath("Assets/Images/Space.png"), 189 DataPackage = CreateDataPackageForImage("Assets/Images/Space.png"), 190 }, 191 new ListItem(new NoOpCommand()) 192 { 193 Title = "Swirls", 194 Subtitle = "Drop me", 195 Icon = IconHelpers.FromRelativePath("Assets/Images/Swirls.png"), 196 DataPackage = CreateDataPackageForImage("Assets/Images/Swirls.png"), 197 }, 198 new ListItem(new NoOpCommand()) 199 { 200 Title = "Windows Digital", 201 Subtitle = "Drag me", 202 Icon = IconHelpers.FromRelativePath("Assets/Images/Win-Digital.png"), 203 DataPackage = CreateDataPackageForImage("Assets/Images/Win-Digital.png"), 204 }, 205 ]; 206 } 207 208 private static DataPackage CreateDataPackageForImage(string relativePath) 209 { 210 var dataPackageWithImage = new DataPackage 211 { 212 Properties = 213 { 214 Title = "Image", 215 Description = "This item has an image associated with it.", 216 }, 217 RequestedOperation = DataPackageOperation.Copy, 218 }; 219 220 var imageUri = new Uri($"ms-appx:///{relativePath}"); 221 222 dataPackageWithImage.SetDataProvider(StandardDataFormats.Bitmap, async (request) => 223 { 224 var deferral = request.GetDeferral(); 225 try 226 { 227 var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(imageUri); 228 var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 229 var streamRef = RandomAccessStreamReference.CreateFromStream(stream); 230 request.SetData(streamRef); 231 } 232 finally 233 { 234 deferral.Complete(); 235 } 236 }); 237 238 dataPackageWithImage.SetDataProvider(StandardDataFormats.StorageItems, async (request) => 239 { 240 var deferral = request.GetDeferral(); 241 try 242 { 243 var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(imageUri); 244 var items = new[] { file }; 245 request.SetData(items); 246 } 247 finally 248 { 249 deferral.Complete(); 250 } 251 }); 252 return dataPackageWithImage; 253 } 254 }