├── .gitattributes ├── .gitignore ├── README.md ├── VirtualizedData.sln ├── VirtualizedData.sln.DotSettings └── VirtualizedData ├── VirtualizedData.Droid ├── Assets │ └── AboutAssets.txt ├── MainActivity.cs ├── Properties │ ├── AndroidManifest.xml │ └── AssemblyInfo.cs ├── Resources │ ├── AboutResources.txt │ ├── drawable-hdpi │ │ └── icon.png │ ├── drawable-xhdpi │ │ └── icon.png │ ├── drawable-xxhdpi │ │ └── icon.png │ └── drawable │ │ └── icon.png ├── VirtualizedData.Droid.csproj └── packages.config ├── VirtualizedData.UWP ├── App.xaml ├── App.xaml.cs ├── Assets │ ├── LockScreenLogo.scale-200.png │ ├── SplashScreen.scale-200.png │ ├── Square150x150Logo.scale-200.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── StoreLogo.png │ └── Wide310x150Logo.scale-200.png ├── MainPage.xaml ├── MainPage.xaml.cs ├── Package.appxmanifest ├── Properties │ ├── AssemblyInfo.cs │ └── Default.rd.xml ├── VirtualizedData.UWP.csproj └── project.json ├── VirtualizedData.iOS ├── AppDelegate.cs ├── Entitlements.plist ├── Info.plist ├── Main.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Default-568h@2x.png │ ├── Default-Portrait.png │ ├── Default-Portrait@2x.png │ ├── Default.png │ ├── Default@2x.png │ ├── Icon-60@2x.png │ ├── Icon-60@3x.png │ ├── Icon-76.png │ ├── Icon-76@2x.png │ ├── Icon-Small-40.png │ ├── Icon-Small-40@2x.png │ ├── Icon-Small-40@3x.png │ ├── Icon-Small.png │ ├── Icon-Small@2x.png │ ├── Icon-Small@3x.png │ └── LaunchScreen.storyboard ├── VirtualizedData.iOS.csproj ├── iTunesArtwork ├── iTunesArtwork@2x └── packages.config └── VirtualizedData ├── App.cs ├── CustomControls └── InfiniteListView.cs ├── Models └── MoviesModel.cs ├── Pages ├── MoviesPage.xaml └── MoviesPage.xaml.cs ├── Properties ├── Annotations.cs └── AssemblyInfo.cs ├── Services ├── IDataService.cs ├── Movie.cs ├── MovieResponse.cs └── MovieService.cs ├── ViewModels ├── MovieViewModel.cs └── MoviesViewModel.cs ├── VirtualizedData.csproj └── packages.config /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opendb 80 | *.opensdf 81 | *.sdf 82 | *.cachefile 83 | *.VC.db 84 | *.VC.VC.opendb 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 149 | # checkin your Azure Web App publish settings, but sensitive information contained 150 | # in these scripts will be unencrypted 151 | PublishScripts/ 152 | 153 | # NuGet Packages 154 | *.nupkg 155 | # The packages folder can be ignored because of Package Restore 156 | **/packages/* 157 | # except build/, which is used as an MSBuild target. 158 | !**/packages/build/ 159 | # Uncomment if necessary however generally it will be regenerated when needed 160 | #!**/packages/repositories.config 161 | # NuGet v3's project.json files produces more ignoreable files 162 | *.nuget.props 163 | *.nuget.targets 164 | 165 | # Microsoft Azure Build Output 166 | csx/ 167 | *.build.csdef 168 | 169 | # Microsoft Azure Emulator 170 | ecf/ 171 | rcf/ 172 | 173 | # Windows Store app package directories and files 174 | AppPackages/ 175 | BundleArtifacts/ 176 | Package.StoreAssociation.xml 177 | _pkginfo.txt 178 | 179 | # Visual Studio cache files 180 | # files ending in .cache can be ignored 181 | *.[Cc]ache 182 | # but keep track of directories ending in .cache 183 | !*.[Cc]ache/ 184 | 185 | # Others 186 | ClientBin/ 187 | ~$* 188 | *~ 189 | *.dbmdl 190 | *.dbproj.schemaview 191 | *.pfx 192 | *.publishsettings 193 | node_modules/ 194 | orleans.codegen.cs 195 | 196 | # Since there are multiple workflows, uncomment next line to ignore bower_components 197 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 198 | #bower_components/ 199 | 200 | # RIA/Silverlight projects 201 | Generated_Code/ 202 | 203 | # Backup & report files from converting an old project file 204 | # to a newer Visual Studio version. Backup files are not needed, 205 | # because we have git ;-) 206 | _UpgradeReport_Files/ 207 | Backup*/ 208 | UpgradeLog*.XML 209 | UpgradeLog*.htm 210 | 211 | # SQL Server files 212 | *.mdf 213 | *.ldf 214 | 215 | # Business Intelligence projects 216 | *.rdl.data 217 | *.bim.layout 218 | *.bim_*.settings 219 | 220 | # Microsoft Fakes 221 | FakesAssemblies/ 222 | 223 | # GhostDoc plugin setting file 224 | *.GhostDoc.xml 225 | 226 | # Node.js Tools for Visual Studio 227 | .ntvs_analysis.dat 228 | 229 | # Visual Studio 6 build log 230 | *.plg 231 | 232 | # Visual Studio 6 workspace options file 233 | *.opt 234 | 235 | # Visual Studio LightSwitch build output 236 | **/*.HTMLClient/GeneratedArtifacts 237 | **/*.DesktopClient/GeneratedArtifacts 238 | **/*.DesktopClient/ModelManifest.xml 239 | **/*.Server/GeneratedArtifacts 240 | **/*.Server/ModelManifest.xml 241 | _Pvt_Extensions 242 | 243 | # Paket dependency manager 244 | .paket/paket.exe 245 | paket-files/ 246 | 247 | # FAKE - F# Make 248 | .fake/ 249 | 250 | # JetBrains Rider 251 | .idea/ 252 | *.sln.iml 253 | /VirtualizedData/VirtualizedData.Droid/Resources/Resource.Designer.cs 254 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VirtualizedData 2 | This repository gives an example of how to dynamically pull in new / paged data while scrolling in a Xamarin Forms listview. 3 | 4 | Check out the videos below if you are to lazy to clone the solution :) 5 | 6 | iOS: 7 | https://youtu.be/0G36HLO_DzI 8 | 9 | Android: 10 | https://www.youtube.com/watch?v=S8UgCUG6BnU 11 | 12 | Any feedback / suggestions are most welcome 13 | -------------------------------------------------------------------------------- /VirtualizedData.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizedData.Droid", "VirtualizedData\VirtualizedData.Droid\VirtualizedData.Droid.csproj", "{A33B69BE-0A35-448B-8717-D3A240627B00}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizedData.iOS", "VirtualizedData\VirtualizedData.iOS\VirtualizedData.iOS.csproj", "{C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizedData.UWP", "VirtualizedData\VirtualizedData.UWP\VirtualizedData.UWP.csproj", "{D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualizedData", "VirtualizedData\VirtualizedData\VirtualizedData.csproj", "{020A0854-8260-4F30-A643-724DECC4CA40}" 13 | EndProject 14 | Global 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 16 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU 17 | Ad-Hoc|ARM = Ad-Hoc|ARM 18 | Ad-Hoc|iPhone = Ad-Hoc|iPhone 19 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator 20 | Ad-Hoc|x64 = Ad-Hoc|x64 21 | Ad-Hoc|x86 = Ad-Hoc|x86 22 | AppStore|Any CPU = AppStore|Any CPU 23 | AppStore|ARM = AppStore|ARM 24 | AppStore|iPhone = AppStore|iPhone 25 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator 26 | AppStore|x64 = AppStore|x64 27 | AppStore|x86 = AppStore|x86 28 | Debug|Any CPU = Debug|Any CPU 29 | Debug|ARM = Debug|ARM 30 | Debug|iPhone = Debug|iPhone 31 | Debug|iPhoneSimulator = Debug|iPhoneSimulator 32 | Debug|x64 = Debug|x64 33 | Debug|x86 = Debug|x86 34 | Release|Any CPU = Release|Any CPU 35 | Release|ARM = Release|ARM 36 | Release|iPhone = Release|iPhone 37 | Release|iPhoneSimulator = Release|iPhoneSimulator 38 | Release|x64 = Release|x64 39 | Release|x86 = Release|x86 40 | EndGlobalSection 41 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 42 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 43 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 44 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU 45 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU 46 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|ARM.Build.0 = Release|Any CPU 47 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU 48 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 49 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU 50 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU 51 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 52 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU 53 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU 54 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU 55 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|x64.Build.0 = Release|Any CPU 56 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU 57 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU 58 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|x86.Build.0 = Release|Any CPU 59 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU 60 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 61 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|Any CPU.Build.0 = Release|Any CPU 62 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|Any CPU.Deploy.0 = Release|Any CPU 63 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|ARM.ActiveCfg = Release|Any CPU 64 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|ARM.Build.0 = Release|Any CPU 65 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|ARM.Deploy.0 = Release|Any CPU 66 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|iPhone.ActiveCfg = Release|Any CPU 67 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|iPhone.Build.0 = Release|Any CPU 68 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|iPhone.Deploy.0 = Release|Any CPU 69 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 70 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU 71 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU 72 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|x64.ActiveCfg = Release|Any CPU 73 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|x64.Build.0 = Release|Any CPU 74 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|x64.Deploy.0 = Release|Any CPU 75 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|x86.ActiveCfg = Release|Any CPU 76 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|x86.Build.0 = Release|Any CPU 77 | {A33B69BE-0A35-448B-8717-D3A240627B00}.AppStore|x86.Deploy.0 = Release|Any CPU 78 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 79 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|Any CPU.Build.0 = Debug|Any CPU 80 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 81 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|ARM.ActiveCfg = Debug|Any CPU 82 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|ARM.Build.0 = Debug|Any CPU 83 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|ARM.Deploy.0 = Debug|Any CPU 84 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|iPhone.ActiveCfg = Debug|Any CPU 85 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|iPhone.Build.0 = Debug|Any CPU 86 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|iPhone.Deploy.0 = Debug|Any CPU 87 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 88 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 89 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU 90 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|x64.ActiveCfg = Debug|Any CPU 91 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|x64.Build.0 = Debug|Any CPU 92 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|x64.Deploy.0 = Debug|Any CPU 93 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|x86.ActiveCfg = Debug|Any CPU 94 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|x86.Build.0 = Debug|Any CPU 95 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Debug|x86.Deploy.0 = Debug|Any CPU 96 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|Any CPU.ActiveCfg = Release|Any CPU 97 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|Any CPU.Build.0 = Release|Any CPU 98 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|Any CPU.Deploy.0 = Release|Any CPU 99 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|ARM.ActiveCfg = Release|Any CPU 100 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|ARM.Build.0 = Release|Any CPU 101 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|ARM.Deploy.0 = Release|Any CPU 102 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|iPhone.ActiveCfg = Release|Any CPU 103 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|iPhone.Build.0 = Release|Any CPU 104 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|iPhone.Deploy.0 = Release|Any CPU 105 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 106 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 107 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU 108 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|x64.ActiveCfg = Release|Any CPU 109 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|x64.Build.0 = Release|Any CPU 110 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|x64.Deploy.0 = Release|Any CPU 111 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|x86.ActiveCfg = Release|Any CPU 112 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|x86.Build.0 = Release|Any CPU 113 | {A33B69BE-0A35-448B-8717-D3A240627B00}.Release|x86.Deploy.0 = Release|Any CPU 114 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone 115 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone 116 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone 117 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone 118 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator 119 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator 120 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone 121 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone 122 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone 123 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|ARM.ActiveCfg = AppStore|iPhone 124 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|iPhone.ActiveCfg = AppStore|iPhone 125 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|iPhone.Build.0 = AppStore|iPhone 126 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator 127 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator 128 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|x64.ActiveCfg = AppStore|iPhone 129 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.AppStore|x86.ActiveCfg = AppStore|iPhone 130 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|Any CPU.ActiveCfg = Debug|iPhone 131 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|Any CPU.Build.0 = Debug|iPhone 132 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|ARM.ActiveCfg = Debug|iPhone 133 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|iPhone.ActiveCfg = Debug|iPhone 134 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|iPhone.Build.0 = Debug|iPhone 135 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator 136 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator 137 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|x64.ActiveCfg = Debug|iPhone 138 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Debug|x86.ActiveCfg = Debug|iPhone 139 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|Any CPU.ActiveCfg = Release|iPhone 140 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|ARM.ActiveCfg = Release|iPhone 141 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|iPhone.ActiveCfg = Release|iPhone 142 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|iPhone.Build.0 = Release|iPhone 143 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator 144 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator 145 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|x64.ActiveCfg = Release|iPhone 146 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8}.Release|x86.ActiveCfg = Release|iPhone 147 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|Any CPU.ActiveCfg = Release|x86 148 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|Any CPU.Build.0 = Release|x86 149 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|Any CPU.Deploy.0 = Release|x86 150 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|ARM.ActiveCfg = Release|ARM 151 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|ARM.Build.0 = Release|ARM 152 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|ARM.Deploy.0 = Release|ARM 153 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|iPhone.ActiveCfg = Release|x86 154 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|iPhone.Build.0 = Release|x86 155 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|iPhone.Deploy.0 = Release|x86 156 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x86 157 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x86 158 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x86 159 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|x64.ActiveCfg = Release|x64 160 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|x64.Build.0 = Release|x64 161 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|x64.Deploy.0 = Release|x64 162 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|x86.ActiveCfg = Release|x86 163 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|x86.Build.0 = Release|x86 164 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Ad-Hoc|x86.Deploy.0 = Release|x86 165 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|Any CPU.ActiveCfg = Release|x86 166 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|Any CPU.Build.0 = Release|x86 167 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|Any CPU.Deploy.0 = Release|x86 168 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|ARM.ActiveCfg = Release|ARM 169 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|ARM.Build.0 = Release|ARM 170 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|ARM.Deploy.0 = Release|ARM 171 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|iPhone.ActiveCfg = Release|x86 172 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|iPhone.Build.0 = Release|x86 173 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|iPhone.Deploy.0 = Release|x86 174 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|iPhoneSimulator.ActiveCfg = Release|x86 175 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|iPhoneSimulator.Build.0 = Release|x86 176 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|iPhoneSimulator.Deploy.0 = Release|x86 177 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|x64.ActiveCfg = Release|x64 178 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|x64.Build.0 = Release|x64 179 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|x64.Deploy.0 = Release|x64 180 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|x86.ActiveCfg = Release|x86 181 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|x86.Build.0 = Release|x86 182 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.AppStore|x86.Deploy.0 = Release|x86 183 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|Any CPU.ActiveCfg = Debug|x86 184 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|Any CPU.Build.0 = Debug|x86 185 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|Any CPU.Deploy.0 = Debug|x86 186 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|ARM.ActiveCfg = Debug|ARM 187 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|ARM.Build.0 = Debug|ARM 188 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|ARM.Deploy.0 = Debug|ARM 189 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|iPhone.ActiveCfg = Debug|x86 190 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 191 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|x64.ActiveCfg = Debug|x64 192 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|x64.Build.0 = Debug|x64 193 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|x64.Deploy.0 = Debug|x64 194 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|x86.ActiveCfg = Debug|x86 195 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|x86.Build.0 = Debug|x86 196 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Debug|x86.Deploy.0 = Debug|x86 197 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|Any CPU.ActiveCfg = Release|x86 198 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|ARM.ActiveCfg = Release|ARM 199 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|ARM.Build.0 = Release|ARM 200 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|ARM.Deploy.0 = Release|ARM 201 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|iPhone.ActiveCfg = Release|x86 202 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|iPhoneSimulator.ActiveCfg = Release|x86 203 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|x64.ActiveCfg = Release|x64 204 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|x64.Build.0 = Release|x64 205 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|x64.Deploy.0 = Release|x64 206 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|x86.ActiveCfg = Release|x86 207 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|x86.Build.0 = Release|x86 208 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3}.Release|x86.Deploy.0 = Release|x86 209 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 210 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 211 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU 212 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|ARM.Build.0 = Release|Any CPU 213 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 214 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU 215 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 216 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU 217 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU 218 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|x64.Build.0 = Release|Any CPU 219 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU 220 | {020A0854-8260-4F30-A643-724DECC4CA40}.Ad-Hoc|x86.Build.0 = Release|Any CPU 221 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 222 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|Any CPU.Build.0 = Release|Any CPU 223 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|ARM.ActiveCfg = Release|Any CPU 224 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|ARM.Build.0 = Release|Any CPU 225 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|iPhone.ActiveCfg = Release|Any CPU 226 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|iPhone.Build.0 = Release|Any CPU 227 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 228 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU 229 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|x64.ActiveCfg = Release|Any CPU 230 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|x64.Build.0 = Release|Any CPU 231 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|x86.ActiveCfg = Release|Any CPU 232 | {020A0854-8260-4F30-A643-724DECC4CA40}.AppStore|x86.Build.0 = Release|Any CPU 233 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 234 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|Any CPU.Build.0 = Debug|Any CPU 235 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|ARM.ActiveCfg = Debug|Any CPU 236 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|ARM.Build.0 = Debug|Any CPU 237 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|iPhone.ActiveCfg = Debug|Any CPU 238 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|iPhone.Build.0 = Debug|Any CPU 239 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 240 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 241 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|x64.ActiveCfg = Debug|Any CPU 242 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|x64.Build.0 = Debug|Any CPU 243 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|x86.ActiveCfg = Debug|Any CPU 244 | {020A0854-8260-4F30-A643-724DECC4CA40}.Debug|x86.Build.0 = Debug|Any CPU 245 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|Any CPU.ActiveCfg = Release|Any CPU 246 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|Any CPU.Build.0 = Release|Any CPU 247 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|ARM.ActiveCfg = Release|Any CPU 248 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|ARM.Build.0 = Release|Any CPU 249 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|iPhone.ActiveCfg = Release|Any CPU 250 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|iPhone.Build.0 = Release|Any CPU 251 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 252 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 253 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|x64.ActiveCfg = Release|Any CPU 254 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|x64.Build.0 = Release|Any CPU 255 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|x86.ActiveCfg = Release|Any CPU 256 | {020A0854-8260-4F30-A643-724DECC4CA40}.Release|x86.Build.0 = Release|Any CPU 257 | EndGlobalSection 258 | GlobalSection(SolutionProperties) = preSolution 259 | HideSolutionNode = FALSE 260 | EndGlobalSection 261 | EndGlobal 262 | -------------------------------------------------------------------------------- /VirtualizedData.sln.DotSettings: -------------------------------------------------------------------------------- 1 |  2 | True -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Assets/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories) and given a Build Action of "AndroidAsset". 3 | 4 | These files will be deployed with you package and will be accessible using Android's 5 | AssetManager, like this: 6 | 7 | public class ReadAsset : Activity 8 | { 9 | protected override void OnCreate (Bundle bundle) 10 | { 11 | base.OnCreate (bundle); 12 | 13 | InputStream input = Assets.Open ("my_asset.txt"); 14 | } 15 | } 16 | 17 | Additionally, some Android functions will automatically load asset files: 18 | 19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); 20 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Android.App; 4 | using Android.Content.PM; 5 | using Android.Runtime; 6 | using Android.Views; 7 | using Android.Widget; 8 | using Android.OS; 9 | 10 | namespace VirtualizedData.Droid 11 | { 12 | [Activity(Label = "VirtualizedData", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 13 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 14 | { 15 | protected override void OnCreate(Bundle bundle) 16 | { 17 | base.OnCreate(bundle); 18 | 19 | global::Xamarin.Forms.Forms.Init(this, bundle); 20 | LoadApplication(new App()); 21 | } 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | using Android.App; 5 | 6 | // General Information about an assembly is controlled through the following 7 | // set of attributes. Change these attribute values to modify the information 8 | // associated with an assembly. 9 | [assembly: AssemblyTitle("VirtualizedData.Droid")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("VirtualizedData.Droid")] 14 | [assembly: AssemblyCopyright("Copyright © 2014")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | [assembly: ComVisible(false)] 18 | 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Build and Revision Numbers 27 | // by using the '*' as shown below: 28 | // [assembly: AssemblyVersion("1.0.*")] 29 | [assembly: AssemblyVersion("1.0.0.0")] 30 | [assembly: AssemblyFileVersion("1.0.0.0")] 31 | 32 | // Add some common permissions, these can be removed if not needed 33 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)] 34 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)] 35 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Resources/AboutResources.txt: -------------------------------------------------------------------------------- 1 | Images, layout descriptions, binary blobs and string dictionaries can be included 2 | in your application as resource files. Various Android APIs are designed to 3 | operate on the resource IDs instead of dealing with images, strings or binary blobs 4 | directly. 5 | 6 | For example, a sample Android app that contains a user interface layout (main.xml), 7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 8 | would keep its resources in the "Resources" directory of the application: 9 | 10 | Resources/ 11 | drawable-hdpi/ 12 | icon.png 13 | 14 | drawable-ldpi/ 15 | icon.png 16 | 17 | drawable-mdpi/ 18 | icon.png 19 | 20 | layout/ 21 | main.xml 22 | 23 | values/ 24 | strings.xml 25 | 26 | In order to get the build system to recognize Android resources, set the build action to 27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but 28 | instead operate on resource IDs. When you compile an Android application that uses resources, 29 | the build system will package the resources for distribution and generate a class called 30 | "Resource" that contains the tokens for each one of the resources included. For example, 31 | for the above Resources layout, this is what the Resource class would expose: 32 | 33 | public class Resource { 34 | public class drawable { 35 | public const int icon = 0x123; 36 | } 37 | 38 | public class layout { 39 | public const int main = 0x456; 40 | } 41 | 42 | public class strings { 43 | public const int first_string = 0xabc; 44 | public const int second_string = 0xbcd; 45 | } 46 | } 47 | 48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main 49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first 50 | string in the dictionary file values/strings.xml. 51 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Resources/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.Droid/Resources/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Resources/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.Droid/Resources/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Resources/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.Droid/Resources/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/Resources/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.Droid/Resources/drawable/icon.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/VirtualizedData.Droid.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.30703 7 | 2.0 8 | {A33B69BE-0A35-448B-8717-D3A240627B00} 9 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10 | Library 11 | Properties 12 | VirtualizedData.Droid 13 | VirtualizedData.Droid 14 | 512 15 | true 16 | Resources\Resource.Designer.cs 17 | Off 18 | Properties\AndroidManifest.xml 19 | true 20 | v6.0 21 | armeabi,armeabi-v7a,x86 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | true 31 | full 32 | false 33 | bin\Debug\ 34 | DEBUG;TRACE 35 | prompt 36 | 4 37 | True 38 | None 39 | 40 | 41 | pdbonly 42 | true 43 | bin\Release\ 44 | TRACE 45 | prompt 46 | 4 47 | False 48 | SdkOnly 49 | 50 | 51 | 52 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\MonoAndroid10\FormsViewGroup.dll 53 | True 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll 63 | True 64 | 65 | 66 | ..\..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll 67 | True 68 | 69 | 70 | ..\..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll 71 | True 72 | 73 | 74 | ..\..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll 75 | True 76 | 77 | 78 | ..\..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll 79 | True 80 | 81 | 82 | ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll 83 | True 84 | 85 | 86 | ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll 87 | True 88 | 89 | 90 | ..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll 91 | True 92 | 93 | 94 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\MonoAndroid10\Xamarin.Forms.Core.dll 95 | True 96 | 97 | 98 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\MonoAndroid10\Xamarin.Forms.Platform.dll 99 | True 100 | 101 | 102 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll 103 | True 104 | 105 | 106 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll 107 | True 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | VirtualizedData 132 | 133 | 134 | 135 | 136 | 137 | 138 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 139 | 140 | 141 | 142 | 143 | 144 | 151 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.Droid/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/App.xaml: -------------------------------------------------------------------------------- 1 |  7 | 8 | 9 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Runtime.InteropServices.WindowsRuntime; 6 | using Windows.ApplicationModel; 7 | using Windows.ApplicationModel.Activation; 8 | using Windows.Foundation; 9 | using Windows.Foundation.Collections; 10 | using Windows.UI.Xaml; 11 | using Windows.UI.Xaml.Controls; 12 | using Windows.UI.Xaml.Controls.Primitives; 13 | using Windows.UI.Xaml.Data; 14 | using Windows.UI.Xaml.Input; 15 | using Windows.UI.Xaml.Media; 16 | using Windows.UI.Xaml.Navigation; 17 | 18 | namespace VirtualizedData.UWP 19 | { 20 | /// 21 | /// Provides application-specific behavior to supplement the default Application class. 22 | /// 23 | sealed partial class App : Application 24 | { 25 | /// 26 | /// Initializes the singleton application object. This is the first line of authored code 27 | /// executed, and as such is the logical equivalent of main() or WinMain(). 28 | /// 29 | public App() 30 | { 31 | this.InitializeComponent(); 32 | this.Suspending += OnSuspending; 33 | } 34 | 35 | /// 36 | /// Invoked when the application is launched normally by the end user. Other entry points 37 | /// will be used such as when the application is launched to open a specific file. 38 | /// 39 | /// Details about the launch request and process. 40 | protected override void OnLaunched(LaunchActivatedEventArgs e) 41 | { 42 | 43 | #if DEBUG 44 | if (System.Diagnostics.Debugger.IsAttached) 45 | { 46 | this.DebugSettings.EnableFrameRateCounter = true; 47 | } 48 | #endif 49 | 50 | Frame rootFrame = Window.Current.Content as Frame; 51 | 52 | // Do not repeat app initialization when the Window already has content, 53 | // just ensure that the window is active 54 | if (rootFrame == null) 55 | { 56 | // Create a Frame to act as the navigation context and navigate to the first page 57 | rootFrame = new Frame(); 58 | 59 | rootFrame.NavigationFailed += OnNavigationFailed; 60 | 61 | Xamarin.Forms.Forms.Init(e); 62 | 63 | if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 64 | { 65 | //TODO: Load state from previously suspended application 66 | } 67 | 68 | // Place the frame in the current Window 69 | Window.Current.Content = rootFrame; 70 | } 71 | 72 | if (rootFrame.Content == null) 73 | { 74 | // When the navigation stack isn't restored navigate to the first page, 75 | // configuring the new page by passing required information as a navigation 76 | // parameter 77 | rootFrame.Navigate(typeof(MainPage), e.Arguments); 78 | } 79 | // Ensure the current window is active 80 | Window.Current.Activate(); 81 | } 82 | 83 | /// 84 | /// Invoked when Navigation to a certain page fails 85 | /// 86 | /// The Frame which failed navigation 87 | /// Details about the navigation failure 88 | void OnNavigationFailed(object sender, NavigationFailedEventArgs e) 89 | { 90 | throw new Exception("Failed to load Page " + e.SourcePageType.FullName); 91 | } 92 | 93 | /// 94 | /// Invoked when application execution is being suspended. Application state is saved 95 | /// without knowing whether the application will be terminated or resumed with the contents 96 | /// of memory still intact. 97 | /// 98 | /// The source of the suspend request. 99 | /// Details about the suspend request. 100 | private void OnSuspending(object sender, SuspendingEventArgs e) 101 | { 102 | var deferral = e.SuspendingOperation.GetDeferral(); 103 | //TODO: Save application state and stop any background activity 104 | deferral.Complete(); 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/StoreLogo.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.UWP/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/MainPage.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | namespace VirtualizedData.UWP 2 | { 3 | public sealed partial class MainPage 4 | { 5 | public MainPage() 6 | { 7 | this.InitializeComponent(); 8 | 9 | LoadApplication(new VirtualizedData.App()); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Package.appxmanifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 8 | 9 | 13 | 14 | 15 | 16 | 17 | FPCL.WIndows 18 | joaqu 19 | Assets\StoreLogo.png 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("VirtualizedData.UWP")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("VirtualizedData.UWP")] 13 | [assembly: AssemblyCopyright("Copyright © 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Version information for an assembly consists of the following four values: 18 | // 19 | // Major Version 20 | // Minor Version 21 | // Build Number 22 | // Revision 23 | // 24 | // You can specify all the values or you can default the Build and Revision Numbers 25 | // by using the '*' as shown below: 26 | // [assembly: AssemblyVersion("1.0.*")] 27 | [assembly: AssemblyVersion("1.0.0.0")] 28 | [assembly: AssemblyFileVersion("1.0.0.0")] 29 | [assembly: ComVisible(false)] -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/Properties/Default.rd.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/VirtualizedData.UWP.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | x86 7 | {D71FEB2F-6B43-46E7-AA1F-42656BF3E3A3} 8 | AppContainerExe 9 | Properties 10 | VirtualizedData.UWP 11 | VirtualizedData.UWP 12 | en-US 13 | UAP 14 | 10.0.10586.0 15 | 10.0.10586.0 16 | 14 17 | true 18 | 512 19 | {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 20 | Windows_TemporaryKey.pfx 21 | 22 | 23 | true 24 | bin\ARM\Debug\ 25 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 26 | ;2008 27 | full 28 | ARM 29 | false 30 | prompt 31 | true 32 | 33 | 34 | bin\ARM\Release\ 35 | TRACE;NETFX_CORE;WINDOWS_UWP 36 | true 37 | ;2008 38 | pdbonly 39 | ARM 40 | false 41 | prompt 42 | true 43 | true 44 | 45 | 46 | true 47 | bin\x64\Debug\ 48 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 49 | ;2008 50 | full 51 | x64 52 | false 53 | prompt 54 | true 55 | 56 | 57 | bin\x64\Release\ 58 | TRACE;NETFX_CORE;WINDOWS_UWP 59 | true 60 | ;2008 61 | pdbonly 62 | x64 63 | false 64 | prompt 65 | true 66 | true 67 | 68 | 69 | true 70 | bin\x86\Debug\ 71 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 72 | ;2008 73 | full 74 | x86 75 | false 76 | prompt 77 | true 78 | 79 | 80 | bin\x86\Release\ 81 | TRACE;NETFX_CORE;WINDOWS_UWP 82 | true 83 | ;2008 84 | pdbonly 85 | x86 86 | false 87 | prompt 88 | true 89 | true 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | App.xaml 98 | 99 | 100 | MainPage.xaml 101 | 102 | 103 | 104 | 105 | 106 | Designer 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | MSBuild:Compile 123 | Designer 124 | 125 | 126 | MSBuild:Compile 127 | Designer 128 | 129 | 130 | 131 | 132 | VirtualizedData 133 | 134 | 135 | 136 | 14.0 137 | 138 | 139 | 146 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.UWP/project.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "Microsoft.NETCore.UniversalWindowsPlatform": "5.1.0", 4 | "Xamarin.Forms": "2.2.0.31" 5 | }, 6 | "frameworks": { 7 | "uap10.0": {} 8 | }, 9 | "runtimes": { 10 | "win10-arm": {}, 11 | "win10-arm-aot": {}, 12 | "win10-x86": {}, 13 | "win10-x86-aot": {}, 14 | "win10-x64": {}, 15 | "win10-x64-aot": {} 16 | } 17 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace VirtualizedData.iOS 9 | { 10 | // The UIApplicationDelegate for the application. This class is responsible for launching the 11 | // User Interface of the application, as well as listening (and optionally responding) to 12 | // application events from iOS. 13 | [Register("AppDelegate")] 14 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 15 | { 16 | // 17 | // This method is invoked when the application has loaded and is ready to run. In this 18 | // method you should instantiate the window, load the UI into it and then make the window 19 | // visible. 20 | // 21 | // You have 17 seconds to return from this method, or iOS will terminate your application. 22 | // 23 | public override bool FinishedLaunching(UIApplication app, NSDictionary options) 24 | { 25 | global::Xamarin.Forms.Forms.Init(); 26 | LoadApplication(new App()); 27 | 28 | return base.FinishedLaunching(app, options); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Info.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UISupportedInterfaceOrientations 11 | 12 | UIInterfaceOrientationPortrait 13 | UIInterfaceOrientationLandscapeLeft 14 | UIInterfaceOrientationLandscapeRight 15 | 16 | UISupportedInterfaceOrientations~ipad 17 | 18 | UIInterfaceOrientationPortrait 19 | UIInterfaceOrientationPortraitUpsideDown 20 | UIInterfaceOrientationLandscapeLeft 21 | UIInterfaceOrientationLandscapeRight 22 | 23 | MinimumOSVersion 24 | 6.0 25 | CFBundleDisplayName 26 | VirtualizedData 27 | CFBundleIdentifier 28 | com.yourcompany.VirtualizedData 29 | CFBundleVersion 30 | 1.0 31 | CFBundleIconFiles 32 | 33 | Icon-60@2x 34 | Icon-60@3x 35 | Icon-76 36 | Icon-76@2x 37 | Default 38 | Default@2x 39 | Default-568h@2x 40 | Default-Portrait 41 | Default-Portrait@2x 42 | Icon-Small-40 43 | Icon-Small-40@2x 44 | Icon-Small-40@3x 45 | Icon-Small 46 | Icon-Small@2x 47 | Icon-Small@3x 48 | 49 | UILaunchStoryboardName 50 | LaunchScreen 51 | 52 | 53 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using UIKit; 2 | 3 | namespace VirtualizedData.iOS 4 | { 5 | public class Application 6 | { 7 | // This is the main entry point of the application. 8 | static void Main(string[] args) 9 | { 10 | // if you want to use a different Application Delegate class from "AppDelegate" 11 | // you can specify it here. 12 | UIApplication.Main(args, null, "AppDelegate"); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("VirtualizedData.iOS")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("VirtualizedData.iOS")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Default.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-60@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-60@3x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-76.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-76@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small-40.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small@2x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/Resources/Icon-Small@3x.png -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/Resources/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/VirtualizedData.iOS.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | iPhoneSimulator 6 | 8.0.30703 7 | 2.0 8 | {C9514F8F-2960-4B48-A5C8-7A2384C1E0A8} 9 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 10 | Exe 11 | VirtualizedData.iOS 12 | Resources 13 | VirtualizedDataiOS 14 | 15 | 16 | 17 | 18 | true 19 | full 20 | false 21 | bin\iPhoneSimulator\Debug 22 | DEBUG 23 | prompt 24 | 4 25 | false 26 | i386, x86_64 27 | None 28 | true 29 | 30 | 31 | none 32 | true 33 | bin\iPhoneSimulator\Release 34 | prompt 35 | 4 36 | None 37 | i386, x86_64 38 | false 39 | 40 | 41 | true 42 | full 43 | false 44 | bin\iPhone\Debug 45 | DEBUG 46 | prompt 47 | 4 48 | false 49 | ARMv7, ARM64 50 | iPhone Developer 51 | true 52 | Entitlements.plist 53 | 54 | 55 | none 56 | true 57 | bin\iPhone\Release 58 | prompt 59 | 4 60 | ARMv7, ARM64 61 | false 62 | iPhone Developer 63 | Entitlements.plist 64 | 65 | 66 | none 67 | True 68 | bin\iPhone\Ad-Hoc 69 | prompt 70 | 4 71 | False 72 | ARMv7, ARM64 73 | True 74 | Automatic:AdHoc 75 | iPhone Distribution 76 | Entitlements.plist 77 | 78 | 79 | none 80 | True 81 | bin\iPhone\AppStore 82 | prompt 83 | 4 84 | False 85 | ARMv7, ARM64 86 | Automatic:AppStore 87 | iPhone Distribution 88 | Entitlements.plist 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | VirtualizedData 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | ..\..\packages\Xamarin.Forms.2.0.0.6482\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll 129 | True 130 | 131 | 132 | ..\..\packages\Xamarin.Forms.2.0.0.6482\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll 133 | True 134 | 135 | 136 | ..\..\packages\Xamarin.Forms.2.0.0.6482\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll 137 | True 138 | 139 | 140 | ..\..\packages\Xamarin.Forms.2.0.0.6482\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll 141 | True 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/iTunesArtwork -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modplug/VirtualizedData/7e153f4be2d5949910e751c2ac108e49a764096e/VirtualizedData/VirtualizedData.iOS/iTunesArtwork@2x -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData.iOS/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/App.cs: -------------------------------------------------------------------------------- 1 | using VirtualizedData.Pages; 2 | using Xamarin.Forms; 3 | 4 | namespace VirtualizedData 5 | { 6 | public class App : Application 7 | { 8 | public App() 9 | { 10 | // The root page of your application 11 | MainPage = new MoviesPage(); 12 | } 13 | 14 | protected override void OnStart() 15 | { 16 | // Handle when your app starts 17 | } 18 | 19 | protected override void OnSleep() 20 | { 21 | // Handle when your app sleeps 22 | } 23 | 24 | protected override void OnResume() 25 | { 26 | // Handle when your app resumes 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/CustomControls/InfiniteListView.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Windows.Input; 3 | using Xamarin.Forms; 4 | 5 | namespace VirtualizedData.CustomControls 6 | { 7 | /// 8 | /// A simple listview that exposes a bindable command to allow infinite loading behaviour. 9 | /// 10 | public class InfiniteListView : ListView 11 | { 12 | /// 13 | /// Respresents the command that is fired to ask the view model to load additional data bound collection. 14 | /// 15 | public static readonly BindableProperty LoadMoreCommandProperty = BindableProperty.Create("LoadMoreCommand", 16 | typeof (ICommand), typeof (InfiniteListView), default(ICommand)); 17 | 18 | public static readonly BindableProperty ShowFooterProperty = BindableProperty.Create("ShowFooter", typeof (bool), 19 | typeof (InfiniteListView), false, BindingMode.OneWay, null, ShowOrHideFooter); 20 | 21 | public static readonly BindableProperty CanLoadMorePagesProperty = BindableProperty.Create("CanLoadMorePages", typeof(bool), 22 | typeof(InfiniteListView), false); 23 | 24 | private readonly StackLayout _footer; 25 | 26 | public ICommand LoadMoreCommand 27 | { 28 | get { return (ICommand)GetValue(LoadMoreCommandProperty); } 29 | set { SetValue(LoadMoreCommandProperty, value); } 30 | } 31 | 32 | public bool ShowFooter 33 | { 34 | get { return (bool)GetValue(ShowFooterProperty); } 35 | set { SetValue(ShowFooterProperty, value); } 36 | } 37 | 38 | public bool CanLoadMorePages 39 | { 40 | get { return (bool)GetValue(CanLoadMorePagesProperty); } 41 | set { SetValue(CanLoadMorePagesProperty, value); } 42 | } 43 | 44 | private static void ShowOrHideFooter(BindableObject bindable, object oldValue, object newValue) 45 | { 46 | InfiniteListView obj = (InfiniteListView) bindable; 47 | if ((bool) oldValue == (bool) newValue) 48 | return; 49 | if ((bool)newValue) 50 | { 51 | if (obj.Footer != null) 52 | { 53 | obj.Footer = obj._footer; 54 | } 55 | } 56 | else 57 | { 58 | // Setting footer to null didn't work so just give it a label to keep it's mouth shut :p 59 | obj.Footer = new Label(); 60 | } 61 | } 62 | 63 | /// 64 | /// Creates a new instance of a 65 | /// 66 | public InfiniteListView() 67 | { 68 | ItemAppearing += InfiniteListView_ItemAppearing; 69 | ActivityIndicator indicator = new ActivityIndicator { IsRunning = true, HorizontalOptions = LayoutOptions.Center }; 70 | Label label = new Label() { Text = "Loading items", HorizontalOptions = LayoutOptions.Center }; 71 | _footer = new StackLayout 72 | { 73 | HorizontalOptions = LayoutOptions.FillAndExpand, 74 | HeightRequest = 100, 75 | Orientation = StackOrientation.Vertical, 76 | Children = {indicator, label} 77 | }; 78 | } 79 | 80 | 81 | void InfiniteListView_ItemAppearing(object sender, ItemVisibilityEventArgs e) 82 | { 83 | if (!CanLoadMorePages) 84 | return; 85 | 86 | var items = ItemsSource as IList; 87 | if (items != null && e.Item == items[items.Count - 1]) 88 | { 89 | if (LoadMoreCommand != null && LoadMoreCommand.CanExecute(null)) 90 | LoadMoreCommand.Execute(null); 91 | } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Models/MoviesModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Reactive.Subjects; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | using DynamicData; 7 | using VirtualizedData.Services; 8 | 9 | namespace VirtualizedData.Models 10 | { 11 | public class MoviesModel : IMoviesModel 12 | { 13 | private readonly IDataService _dataService; 14 | private readonly SourceList _moviesInternalList; 15 | private CancellationTokenSource _cts; 16 | private string _query; 17 | private bool _searchActive; 18 | private int _pageNumber; 19 | 20 | 21 | public MoviesModel(IDataService dataService) 22 | { 23 | _dataService = dataService; 24 | _moviesInternalList = new SourceList(); 25 | RemainingPages = new Subject(); 26 | _cts = new CancellationTokenSource(); 27 | } 28 | 29 | public IObservableList Movies => _moviesInternalList; 30 | public Subject RemainingPages { get; set; } 31 | 32 | public async Task GetPage(string query, int pageNumber) 33 | { 34 | if (string.IsNullOrEmpty(query)) 35 | { 36 | RemainingPages.OnNext(0); 37 | _moviesInternalList.Clear(); 38 | _searchActive = false; 39 | return; 40 | } 41 | if (query == _query && pageNumber == _pageNumber) 42 | return; 43 | 44 | // Cancel search 45 | if (_searchActive) 46 | { 47 | _cts.Cancel(); 48 | _cts = new CancellationTokenSource(); 49 | } 50 | 51 | try 52 | { 53 | _searchActive = true; 54 | var result = await _dataService.GetItemsAsync(query, pageNumber, _cts.Token); 55 | if (_query != query) 56 | { 57 | _moviesInternalList.Clear(); 58 | } 59 | _query = query; 60 | _pageNumber = pageNumber; 61 | if (result.Response) 62 | { 63 | _moviesInternalList.Edit(list => list.AddRange(result.Movies)); 64 | RemainingPages.OnNext(result.RemainingPages); 65 | } 66 | else 67 | { 68 | RemainingPages.OnNext(0); 69 | } 70 | } 71 | catch (OperationCanceledException) 72 | { 73 | Debug.WriteLine("Cancelled previous search"); 74 | _searchActive = false; 75 | await GetPage(query, pageNumber); 76 | 77 | } 78 | catch (Exception e) 79 | { 80 | RemainingPages.OnNext(0); 81 | Debug.WriteLine("Something unexpected happened while fetching data"); 82 | } 83 | finally 84 | { 85 | _searchActive = false; 86 | } 87 | } 88 | } 89 | } 90 | 91 | public interface IMoviesModel 92 | { 93 | IObservableList Movies { get; } 94 | Subject RemainingPages { get; set; } 95 | Task GetPage(string query, int pageNumber); 96 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Pages/MoviesPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 8 | 9 | 10 | 11 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Pages/MoviesPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using VirtualizedData.Models; 4 | using VirtualizedData.Services; 5 | using VirtualizedData.ViewModels; 6 | using Xamarin.Forms; 7 | 8 | namespace VirtualizedData.Pages 9 | { 10 | public partial class MoviesPage : ContentPage 11 | { 12 | MoviesViewModel ViewModel => _vm ?? (_vm = BindingContext as MoviesViewModel); 13 | private MoviesViewModel _vm; 14 | 15 | public MoviesPage() 16 | { 17 | InitializeComponent(); 18 | BindingContext = new MoviesViewModel(new MoviesModel(new MovieService())); 19 | 20 | } 21 | 22 | protected override void OnAppearing() 23 | { 24 | Task.Run(async () => 25 | { 26 | try 27 | { 28 | await ViewModel.LoadPage(1); 29 | } 30 | catch (Exception e) 31 | { 32 | 33 | } 34 | }); 35 | base.OnAppearing(); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Properties/Annotations.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | #pragma warning disable 1591 4 | // ReSharper disable UnusedMember.Global 5 | // ReSharper disable MemberCanBePrivate.Global 6 | // ReSharper disable UnusedAutoPropertyAccessor.Global 7 | // ReSharper disable IntroduceOptionalParameters.Global 8 | // ReSharper disable MemberCanBeProtected.Global 9 | // ReSharper disable InconsistentNaming 10 | 11 | namespace VirtualizedData.Annotations 12 | { 13 | /// 14 | /// Indicates that the value of the marked element could be null sometimes, 15 | /// so the check for null is necessary before its usage. 16 | /// 17 | /// 18 | /// [CanBeNull] object Test() => null; 19 | /// 20 | /// void UseTest() { 21 | /// var p = Test(); 22 | /// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' 23 | /// } 24 | /// 25 | [AttributeUsage( 26 | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | 27 | AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event)] 28 | public sealed class CanBeNullAttribute : Attribute { } 29 | 30 | /// 31 | /// Indicates that the value of the marked element could never be null. 32 | /// 33 | /// 34 | /// [NotNull] object Foo() { 35 | /// return null; // Warning: Possible 'null' assignment 36 | /// } 37 | /// 38 | [AttributeUsage( 39 | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | 40 | AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event)] 41 | public sealed class NotNullAttribute : Attribute { } 42 | 43 | /// 44 | /// Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task 45 | /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property 46 | /// or of the Lazy.Value property can never be null. 47 | /// 48 | [AttributeUsage( 49 | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | 50 | AttributeTargets.Delegate | AttributeTargets.Field)] 51 | public sealed class ItemNotNullAttribute : Attribute { } 52 | 53 | /// 54 | /// Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task 55 | /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property 56 | /// or of the Lazy.Value property can be null. 57 | /// 58 | [AttributeUsage( 59 | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | 60 | AttributeTargets.Delegate | AttributeTargets.Field)] 61 | public sealed class ItemCanBeNullAttribute : Attribute { } 62 | 63 | /// 64 | /// Indicates that the marked method builds string by format pattern and (optional) arguments. 65 | /// Parameter, which contains format string, should be given in constructor. The format string 66 | /// should be in -like form. 67 | /// 68 | /// 69 | /// [StringFormatMethod("message")] 70 | /// void ShowError(string message, params object[] args) { /* do something */ } 71 | /// 72 | /// void Foo() { 73 | /// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string 74 | /// } 75 | /// 76 | [AttributeUsage( 77 | AttributeTargets.Constructor | AttributeTargets.Method | 78 | AttributeTargets.Property | AttributeTargets.Delegate)] 79 | public sealed class StringFormatMethodAttribute : Attribute 80 | { 81 | /// 82 | /// Specifies which parameter of an annotated method should be treated as format-string 83 | /// 84 | public StringFormatMethodAttribute(string formatParameterName) 85 | { 86 | FormatParameterName = formatParameterName; 87 | } 88 | 89 | public string FormatParameterName { get; private set; } 90 | } 91 | 92 | /// 93 | /// For a parameter that is expected to be one of the limited set of values. 94 | /// Specify fields of which type should be used as values for this parameter. 95 | /// 96 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field)] 97 | public sealed class ValueProviderAttribute : Attribute 98 | { 99 | public ValueProviderAttribute(string name) 100 | { 101 | Name = name; 102 | } 103 | 104 | [NotNull] public string Name { get; private set; } 105 | } 106 | 107 | /// 108 | /// Indicates that the function argument should be string literal and match one 109 | /// of the parameters of the caller function. For example, ReSharper annotates 110 | /// the parameter of . 111 | /// 112 | /// 113 | /// void Foo(string param) { 114 | /// if (param == null) 115 | /// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol 116 | /// } 117 | /// 118 | [AttributeUsage(AttributeTargets.Parameter)] 119 | public sealed class InvokerParameterNameAttribute : Attribute { } 120 | 121 | /// 122 | /// Indicates that the method is contained in a type that implements 123 | /// System.ComponentModel.INotifyPropertyChanged interface and this method 124 | /// is used to notify that some property value changed. 125 | /// 126 | /// 127 | /// The method should be non-static and conform to one of the supported signatures: 128 | /// 129 | /// NotifyChanged(string) 130 | /// NotifyChanged(params string[]) 131 | /// NotifyChanged{T}(Expression{Func{T}}) 132 | /// NotifyChanged{T,U}(Expression{Func{T,U}}) 133 | /// SetProperty{T}(ref T, T, string) 134 | /// 135 | /// 136 | /// 137 | /// public class Foo : INotifyPropertyChanged { 138 | /// public event PropertyChangedEventHandler PropertyChanged; 139 | /// 140 | /// [NotifyPropertyChangedInvocator] 141 | /// protected virtual void NotifyChanged(string propertyName) { ... } 142 | /// 143 | /// string _name; 144 | /// 145 | /// public string Name { 146 | /// get { return _name; } 147 | /// set { _name = value; NotifyChanged("LastName"); /* Warning */ } 148 | /// } 149 | /// } 150 | /// 151 | /// Examples of generated notifications: 152 | /// 153 | /// NotifyChanged("Property") 154 | /// NotifyChanged(() => Property) 155 | /// NotifyChanged((VM x) => x.Property) 156 | /// SetProperty(ref myField, value, "Property") 157 | /// 158 | /// 159 | [AttributeUsage(AttributeTargets.Method)] 160 | public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute 161 | { 162 | public NotifyPropertyChangedInvocatorAttribute() { } 163 | public NotifyPropertyChangedInvocatorAttribute(string parameterName) 164 | { 165 | ParameterName = parameterName; 166 | } 167 | 168 | public string ParameterName { get; private set; } 169 | } 170 | 171 | /// 172 | /// Describes dependency between method input and output. 173 | /// 174 | /// 175 | ///

Function Definition Table syntax:

176 | /// 177 | /// FDT ::= FDTRow [;FDTRow]* 178 | /// FDTRow ::= Input => Output | Output <= Input 179 | /// Input ::= ParameterName: Value [, Input]* 180 | /// Output ::= [ParameterName: Value]* {halt|stop|void|nothing|Value} 181 | /// Value ::= true | false | null | notnull | canbenull 182 | /// 183 | /// If method has single input parameter, it's name could be omitted.
184 | /// Using halt (or void/nothing, which is the same) 185 | /// for method output means that the methos doesn't return normally.
186 | /// canbenull annotation is only applicable for output parameters.
187 | /// You can use multiple [ContractAnnotation] for each FDT row, 188 | /// or use single attribute with rows separated by semicolon.
189 | ///
190 | /// 191 | /// 192 | /// [ContractAnnotation("=> halt")] 193 | /// public void TerminationMethod() 194 | /// 195 | /// 196 | /// [ContractAnnotation("halt <= condition: false")] 197 | /// public void Assert(bool condition, string text) // regular assertion method 198 | /// 199 | /// 200 | /// [ContractAnnotation("s:null => true")] 201 | /// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() 202 | /// 203 | /// 204 | /// // A method that returns null if the parameter is null, 205 | /// // and not null if the parameter is not null 206 | /// [ContractAnnotation("null => null; notnull => notnull")] 207 | /// public object Transform(object data) 208 | /// 209 | /// 210 | /// [ContractAnnotation("s:null=>false; =>true,result:notnull; =>false, result:null")] 211 | /// public bool TryParse(string s, out Person result) 212 | /// 213 | /// 214 | [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 215 | public sealed class ContractAnnotationAttribute : Attribute 216 | { 217 | public ContractAnnotationAttribute([NotNull] string contract) 218 | : this(contract, false) { } 219 | 220 | public ContractAnnotationAttribute([NotNull] string contract, bool forceFullStates) 221 | { 222 | Contract = contract; 223 | ForceFullStates = forceFullStates; 224 | } 225 | 226 | public string Contract { get; private set; } 227 | public bool ForceFullStates { get; private set; } 228 | } 229 | 230 | /// 231 | /// Indicates that marked element should be localized or not. 232 | /// 233 | /// 234 | /// [LocalizationRequiredAttribute(true)] 235 | /// class Foo { 236 | /// string str = "my string"; // Warning: Localizable string 237 | /// } 238 | /// 239 | [AttributeUsage(AttributeTargets.All)] 240 | public sealed class LocalizationRequiredAttribute : Attribute 241 | { 242 | public LocalizationRequiredAttribute() : this(true) { } 243 | public LocalizationRequiredAttribute(bool required) 244 | { 245 | Required = required; 246 | } 247 | 248 | public bool Required { get; private set; } 249 | } 250 | 251 | /// 252 | /// Indicates that the value of the marked type (or its derivatives) 253 | /// cannot be compared using '==' or '!=' operators and Equals() 254 | /// should be used instead. However, using '==' or '!=' for comparison 255 | /// with null is always permitted. 256 | /// 257 | /// 258 | /// [CannotApplyEqualityOperator] 259 | /// class NoEquality { } 260 | /// 261 | /// class UsesNoEquality { 262 | /// void Test() { 263 | /// var ca1 = new NoEquality(); 264 | /// var ca2 = new NoEquality(); 265 | /// if (ca1 != null) { // OK 266 | /// bool condition = ca1 == ca2; // Warning 267 | /// } 268 | /// } 269 | /// } 270 | /// 271 | [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Struct)] 272 | public sealed class CannotApplyEqualityOperatorAttribute : Attribute { } 273 | 274 | /// 275 | /// When applied to a target attribute, specifies a requirement for any type marked 276 | /// with the target attribute to implement or inherit specific type or types. 277 | /// 278 | /// 279 | /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement 280 | /// class ComponentAttribute : Attribute { } 281 | /// 282 | /// [Component] // ComponentAttribute requires implementing IComponent interface 283 | /// class MyComponent : IComponent { } 284 | /// 285 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] 286 | [BaseTypeRequired(typeof(Attribute))] 287 | public sealed class BaseTypeRequiredAttribute : Attribute 288 | { 289 | public BaseTypeRequiredAttribute([NotNull] Type baseType) 290 | { 291 | BaseType = baseType; 292 | } 293 | 294 | [NotNull] public Type BaseType { get; private set; } 295 | } 296 | 297 | /// 298 | /// Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library), 299 | /// so this symbol will not be marked as unused (as well as by other usage inspections). 300 | /// 301 | [AttributeUsage(AttributeTargets.All)] 302 | public sealed class UsedImplicitlyAttribute : Attribute 303 | { 304 | public UsedImplicitlyAttribute() 305 | : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { } 306 | 307 | public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags) 308 | : this(useKindFlags, ImplicitUseTargetFlags.Default) { } 309 | 310 | public UsedImplicitlyAttribute(ImplicitUseTargetFlags targetFlags) 311 | : this(ImplicitUseKindFlags.Default, targetFlags) { } 312 | 313 | public UsedImplicitlyAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) 314 | { 315 | UseKindFlags = useKindFlags; 316 | TargetFlags = targetFlags; 317 | } 318 | 319 | public ImplicitUseKindFlags UseKindFlags { get; private set; } 320 | public ImplicitUseTargetFlags TargetFlags { get; private set; } 321 | } 322 | 323 | /// 324 | /// Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes 325 | /// as unused (as well as by other usage inspections) 326 | /// 327 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.GenericParameter)] 328 | public sealed class MeansImplicitUseAttribute : Attribute 329 | { 330 | public MeansImplicitUseAttribute() 331 | : this(ImplicitUseKindFlags.Default, ImplicitUseTargetFlags.Default) { } 332 | 333 | public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags) 334 | : this(useKindFlags, ImplicitUseTargetFlags.Default) { } 335 | 336 | public MeansImplicitUseAttribute(ImplicitUseTargetFlags targetFlags) 337 | : this(ImplicitUseKindFlags.Default, targetFlags) { } 338 | 339 | public MeansImplicitUseAttribute(ImplicitUseKindFlags useKindFlags, ImplicitUseTargetFlags targetFlags) 340 | { 341 | UseKindFlags = useKindFlags; 342 | TargetFlags = targetFlags; 343 | } 344 | 345 | [UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; } 346 | [UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; } 347 | } 348 | 349 | [Flags] 350 | public enum ImplicitUseKindFlags 351 | { 352 | Default = Access | Assign | InstantiatedWithFixedConstructorSignature, 353 | /// Only entity marked with attribute considered used. 354 | Access = 1, 355 | /// Indicates implicit assignment to a member. 356 | Assign = 2, 357 | /// 358 | /// Indicates implicit instantiation of a type with fixed constructor signature. 359 | /// That means any unused constructor parameters won't be reported as such. 360 | /// 361 | InstantiatedWithFixedConstructorSignature = 4, 362 | /// Indicates implicit instantiation of a type. 363 | InstantiatedNoFixedConstructorSignature = 8, 364 | } 365 | 366 | /// 367 | /// Specify what is considered used implicitly when marked 368 | /// with or . 369 | /// 370 | [Flags] 371 | public enum ImplicitUseTargetFlags 372 | { 373 | Default = Itself, 374 | Itself = 1, 375 | /// Members of entity marked with attribute are considered used. 376 | Members = 2, 377 | /// Entity marked with attribute and all its members considered used. 378 | WithMembers = Itself | Members 379 | } 380 | 381 | /// 382 | /// This attribute is intended to mark publicly available API 383 | /// which should not be removed and so is treated as used. 384 | /// 385 | [MeansImplicitUse(ImplicitUseTargetFlags.WithMembers)] 386 | public sealed class PublicAPIAttribute : Attribute 387 | { 388 | public PublicAPIAttribute() { } 389 | public PublicAPIAttribute([NotNull] string comment) 390 | { 391 | Comment = comment; 392 | } 393 | 394 | public string Comment { get; private set; } 395 | } 396 | 397 | /// 398 | /// Tells code analysis engine if the parameter is completely handled when the invoked method is on stack. 399 | /// If the parameter is a delegate, indicates that delegate is executed while the method is executed. 400 | /// If the parameter is an enumerable, indicates that it is enumerated while the method is executed. 401 | /// 402 | [AttributeUsage(AttributeTargets.Parameter)] 403 | public sealed class InstantHandleAttribute : Attribute { } 404 | 405 | /// 406 | /// Indicates that a method does not make any observable state changes. 407 | /// The same as System.Diagnostics.Contracts.PureAttribute. 408 | /// 409 | /// 410 | /// [Pure] int Multiply(int x, int y) => x * y; 411 | /// 412 | /// void M() { 413 | /// Multiply(123, 42); // Waring: Return value of pure method is not used 414 | /// } 415 | /// 416 | [AttributeUsage(AttributeTargets.Method)] 417 | public sealed class PureAttribute : Attribute { } 418 | 419 | /// 420 | /// Indicates that the return value of method invocation must be used. 421 | /// 422 | [AttributeUsage(AttributeTargets.Method)] 423 | public sealed class MustUseReturnValueAttribute : Attribute 424 | { 425 | public MustUseReturnValueAttribute() { } 426 | public MustUseReturnValueAttribute([NotNull] string justification) 427 | { 428 | Justification = justification; 429 | } 430 | 431 | public string Justification { get; private set; } 432 | } 433 | 434 | /// 435 | /// Indicates the type member or parameter of some type, that should be used instead of all other ways 436 | /// to get the value that type. This annotation is useful when you have some "context" value evaluated 437 | /// and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one. 438 | /// 439 | /// 440 | /// class Foo { 441 | /// [ProvidesContext] IBarService _barService = ...; 442 | /// 443 | /// void ProcessNode(INode node) { 444 | /// DoSomething(node, node.GetGlobalServices().Bar); 445 | /// // ^ Warning: use value of '_barService' field 446 | /// } 447 | /// } 448 | /// 449 | [AttributeUsage( 450 | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter | 451 | AttributeTargets.Method)] 452 | public sealed class ProvidesContextAttribute : Attribute { } 453 | 454 | /// 455 | /// Indicates that a parameter is a path to a file or a folder within a web project. 456 | /// Path can be relative or absolute, starting from web root (~). 457 | /// 458 | [AttributeUsage(AttributeTargets.Parameter)] 459 | public sealed class PathReferenceAttribute : Attribute 460 | { 461 | public PathReferenceAttribute() { } 462 | public PathReferenceAttribute([PathReference] string basePath) 463 | { 464 | BasePath = basePath; 465 | } 466 | 467 | public string BasePath { get; private set; } 468 | } 469 | 470 | /// 471 | /// An extension method marked with this attribute is processed by ReSharper code completion 472 | /// as a 'Source Template'. When extension method is completed over some expression, it's source code 473 | /// is automatically expanded like a template at call site. 474 | /// 475 | /// 476 | /// Template method body can contain valid source code and/or special comments starting with '$'. 477 | /// Text inside these comments is added as source code when the template is applied. Template parameters 478 | /// can be used either as additional method parameters or as identifiers wrapped in two '$' signs. 479 | /// Use the attribute to specify macros for parameters. 480 | /// 481 | /// 482 | /// In this example, the 'forEach' method is a source template available over all values 483 | /// of enumerable types, producing ordinary C# 'foreach' statement and placing caret inside block: 484 | /// 485 | /// [SourceTemplate] 486 | /// public static void forEach<T>(this IEnumerable<T> xs) { 487 | /// foreach (var x in xs) { 488 | /// //$ $END$ 489 | /// } 490 | /// } 491 | /// 492 | /// 493 | [AttributeUsage(AttributeTargets.Method)] 494 | public sealed class SourceTemplateAttribute : Attribute { } 495 | 496 | /// 497 | /// Allows specifying a macro for a parameter of a source template. 498 | /// 499 | /// 500 | /// You can apply the attribute on the whole method or on any of its additional parameters. The macro expression 501 | /// is defined in the property. When applied on a method, the target 502 | /// template parameter is defined in the property. To apply the macro silently 503 | /// for the parameter, set the property value = -1. 504 | /// 505 | /// 506 | /// Applying the attribute on a source template method: 507 | /// 508 | /// [SourceTemplate, Macro(Target = "item", Expression = "suggestVariableName()")] 509 | /// public static void forEach<T>(this IEnumerable<T> collection) { 510 | /// foreach (var item in collection) { 511 | /// //$ $END$ 512 | /// } 513 | /// } 514 | /// 515 | /// Applying the attribute on a template method parameter: 516 | /// 517 | /// [SourceTemplate] 518 | /// public static void something(this Entity x, [Macro(Expression = "guid()", Editable = -1)] string newguid) { 519 | /// /*$ var $x$Id = "$newguid$" + x.ToString(); 520 | /// x.DoSomething($x$Id); */ 521 | /// } 522 | /// 523 | /// 524 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method, AllowMultiple = true)] 525 | public sealed class MacroAttribute : Attribute 526 | { 527 | /// 528 | /// Allows specifying a macro that will be executed for a source template 529 | /// parameter when the template is expanded. 530 | /// 531 | public string Expression { get; set; } 532 | 533 | /// 534 | /// Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. 535 | /// 536 | /// 537 | /// If the target parameter is used several times in the template, only one occurrence becomes editable; 538 | /// other occurrences are changed synchronously. To specify the zero-based index of the editable occurrence, 539 | /// use values >= 0. To make the parameter non-editable when the template is expanded, use -1. 540 | /// > 541 | public int Editable { get; set; } 542 | 543 | /// 544 | /// Identifies the target parameter of a source template if the 545 | /// is applied on a template method. 546 | /// 547 | public string Target { get; set; } 548 | } 549 | 550 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 551 | public sealed class AspMvcAreaMasterLocationFormatAttribute : Attribute 552 | { 553 | public AspMvcAreaMasterLocationFormatAttribute(string format) 554 | { 555 | Format = format; 556 | } 557 | 558 | public string Format { get; private set; } 559 | } 560 | 561 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 562 | public sealed class AspMvcAreaPartialViewLocationFormatAttribute : Attribute 563 | { 564 | public AspMvcAreaPartialViewLocationFormatAttribute(string format) 565 | { 566 | Format = format; 567 | } 568 | 569 | public string Format { get; private set; } 570 | } 571 | 572 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 573 | public sealed class AspMvcAreaViewLocationFormatAttribute : Attribute 574 | { 575 | public AspMvcAreaViewLocationFormatAttribute(string format) 576 | { 577 | Format = format; 578 | } 579 | 580 | public string Format { get; private set; } 581 | } 582 | 583 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 584 | public sealed class AspMvcMasterLocationFormatAttribute : Attribute 585 | { 586 | public AspMvcMasterLocationFormatAttribute(string format) 587 | { 588 | Format = format; 589 | } 590 | 591 | public string Format { get; private set; } 592 | } 593 | 594 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 595 | public sealed class AspMvcPartialViewLocationFormatAttribute : Attribute 596 | { 597 | public AspMvcPartialViewLocationFormatAttribute(string format) 598 | { 599 | Format = format; 600 | } 601 | 602 | public string Format { get; private set; } 603 | } 604 | 605 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 606 | public sealed class AspMvcViewLocationFormatAttribute : Attribute 607 | { 608 | public AspMvcViewLocationFormatAttribute(string format) 609 | { 610 | Format = format; 611 | } 612 | 613 | public string Format { get; private set; } 614 | } 615 | 616 | /// 617 | /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter 618 | /// is an MVC action. If applied to a method, the MVC action name is calculated 619 | /// implicitly from the context. Use this attribute for custom wrappers similar to 620 | /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). 621 | /// 622 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] 623 | public sealed class AspMvcActionAttribute : Attribute 624 | { 625 | public AspMvcActionAttribute() { } 626 | public AspMvcActionAttribute(string anonymousProperty) 627 | { 628 | AnonymousProperty = anonymousProperty; 629 | } 630 | 631 | public string AnonymousProperty { get; private set; } 632 | } 633 | 634 | /// 635 | /// ASP.NET MVC attribute. Indicates that a parameter is an MVC area. 636 | /// Use this attribute for custom wrappers similar to 637 | /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String). 638 | /// 639 | [AttributeUsage(AttributeTargets.Parameter)] 640 | public sealed class AspMvcAreaAttribute : Attribute 641 | { 642 | public AspMvcAreaAttribute() { } 643 | public AspMvcAreaAttribute(string anonymousProperty) 644 | { 645 | AnonymousProperty = anonymousProperty; 646 | } 647 | 648 | public string AnonymousProperty { get; private set; } 649 | } 650 | 651 | /// 652 | /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is 653 | /// an MVC controller. If applied to a method, the MVC controller name is calculated 654 | /// implicitly from the context. Use this attribute for custom wrappers similar to 655 | /// System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper, String, String). 656 | /// 657 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] 658 | public sealed class AspMvcControllerAttribute : Attribute 659 | { 660 | public AspMvcControllerAttribute() { } 661 | public AspMvcControllerAttribute(string anonymousProperty) 662 | { 663 | AnonymousProperty = anonymousProperty; 664 | } 665 | 666 | public string AnonymousProperty { get; private set; } 667 | } 668 | 669 | /// 670 | /// ASP.NET MVC attribute. Indicates that a parameter is an MVC Master. Use this attribute 671 | /// for custom wrappers similar to System.Web.Mvc.Controller.View(String, String). 672 | /// 673 | [AttributeUsage(AttributeTargets.Parameter)] 674 | public sealed class AspMvcMasterAttribute : Attribute { } 675 | 676 | /// 677 | /// ASP.NET MVC attribute. Indicates that a parameter is an MVC model type. Use this attribute 678 | /// for custom wrappers similar to System.Web.Mvc.Controller.View(String, Object). 679 | /// 680 | [AttributeUsage(AttributeTargets.Parameter)] 681 | public sealed class AspMvcModelTypeAttribute : Attribute { } 682 | 683 | /// 684 | /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter is an MVC 685 | /// partial view. If applied to a method, the MVC partial view name is calculated implicitly 686 | /// from the context. Use this attribute for custom wrappers similar to 687 | /// System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper, String). 688 | /// 689 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] 690 | public sealed class AspMvcPartialViewAttribute : Attribute { } 691 | 692 | /// 693 | /// ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. 694 | /// 695 | [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 696 | public sealed class AspMvcSuppressViewErrorAttribute : Attribute { } 697 | 698 | /// 699 | /// ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. 700 | /// Use this attribute for custom wrappers similar to 701 | /// System.Web.Mvc.Html.DisplayExtensions.DisplayForModel(HtmlHelper, String). 702 | /// 703 | [AttributeUsage(AttributeTargets.Parameter)] 704 | public sealed class AspMvcDisplayTemplateAttribute : Attribute { } 705 | 706 | /// 707 | /// ASP.NET MVC attribute. Indicates that a parameter is an MVC editor template. 708 | /// Use this attribute for custom wrappers similar to 709 | /// System.Web.Mvc.Html.EditorExtensions.EditorForModel(HtmlHelper, String). 710 | /// 711 | [AttributeUsage(AttributeTargets.Parameter)] 712 | public sealed class AspMvcEditorTemplateAttribute : Attribute { } 713 | 714 | /// 715 | /// ASP.NET MVC attribute. Indicates that a parameter is an MVC template. 716 | /// Use this attribute for custom wrappers similar to 717 | /// System.ComponentModel.DataAnnotations.UIHintAttribute(System.String). 718 | /// 719 | [AttributeUsage(AttributeTargets.Parameter)] 720 | public sealed class AspMvcTemplateAttribute : Attribute { } 721 | 722 | /// 723 | /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter 724 | /// is an MVC view component. If applied to a method, the MVC view name is calculated implicitly 725 | /// from the context. Use this attribute for custom wrappers similar to 726 | /// System.Web.Mvc.Controller.View(Object). 727 | /// 728 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] 729 | public sealed class AspMvcViewAttribute : Attribute { } 730 | 731 | /// 732 | /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter 733 | /// is an MVC view component name. 734 | /// 735 | [AttributeUsage(AttributeTargets.Parameter)] 736 | public sealed class AspMvcViewComponentAttribute : Attribute { } 737 | 738 | /// 739 | /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter 740 | /// is an MVC view component view. If applied to a method, the MVC view component view name is default. 741 | /// 742 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] 743 | public sealed class AspMvcViewComponentViewAttribute : Attribute { } 744 | 745 | /// 746 | /// ASP.NET MVC attribute. When applied to a parameter of an attribute, 747 | /// indicates that this parameter is an MVC action name. 748 | /// 749 | /// 750 | /// [ActionName("Foo")] 751 | /// public ActionResult Login(string returnUrl) { 752 | /// ViewBag.ReturnUrl = Url.Action("Foo"); // OK 753 | /// return RedirectToAction("Bar"); // Error: Cannot resolve action 754 | /// } 755 | /// 756 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] 757 | public sealed class AspMvcActionSelectorAttribute : Attribute { } 758 | 759 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field)] 760 | public sealed class HtmlElementAttributesAttribute : Attribute 761 | { 762 | public HtmlElementAttributesAttribute() { } 763 | public HtmlElementAttributesAttribute(string name) 764 | { 765 | Name = name; 766 | } 767 | 768 | public string Name { get; private set; } 769 | } 770 | 771 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] 772 | public sealed class HtmlAttributeValueAttribute : Attribute 773 | { 774 | public HtmlAttributeValueAttribute([NotNull] string name) 775 | { 776 | Name = name; 777 | } 778 | 779 | [NotNull] public string Name { get; private set; } 780 | } 781 | 782 | /// 783 | /// Razor attribute. Indicates that a parameter or a method is a Razor section. 784 | /// Use this attribute for custom wrappers similar to 785 | /// System.Web.WebPages.WebPageBase.RenderSection(String). 786 | /// 787 | [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] 788 | public sealed class RazorSectionAttribute : Attribute { } 789 | 790 | /// 791 | /// Indicates how method, constructor invocation or property access 792 | /// over collection type affects content of the collection. 793 | /// 794 | [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property)] 795 | public sealed class CollectionAccessAttribute : Attribute 796 | { 797 | public CollectionAccessAttribute(CollectionAccessType collectionAccessType) 798 | { 799 | CollectionAccessType = collectionAccessType; 800 | } 801 | 802 | public CollectionAccessType CollectionAccessType { get; private set; } 803 | } 804 | 805 | [Flags] 806 | public enum CollectionAccessType 807 | { 808 | /// Method does not use or modify content of the collection. 809 | None = 0, 810 | /// Method only reads content of the collection but does not modify it. 811 | Read = 1, 812 | /// Method can change content of the collection but does not add new elements. 813 | ModifyExistingContent = 2, 814 | /// Method can add new elements to the collection. 815 | UpdatedContent = ModifyExistingContent | 4 816 | } 817 | 818 | /// 819 | /// Indicates that the marked method is assertion method, i.e. it halts control flow if 820 | /// one of the conditions is satisfied. To set the condition, mark one of the parameters with 821 | /// attribute. 822 | /// 823 | [AttributeUsage(AttributeTargets.Method)] 824 | public sealed class AssertionMethodAttribute : Attribute { } 825 | 826 | /// 827 | /// Indicates the condition parameter of the assertion method. The method itself should be 828 | /// marked by attribute. The mandatory argument of 829 | /// the attribute is the assertion type. 830 | /// 831 | [AttributeUsage(AttributeTargets.Parameter)] 832 | public sealed class AssertionConditionAttribute : Attribute 833 | { 834 | public AssertionConditionAttribute(AssertionConditionType conditionType) 835 | { 836 | ConditionType = conditionType; 837 | } 838 | 839 | public AssertionConditionType ConditionType { get; private set; } 840 | } 841 | 842 | /// 843 | /// Specifies assertion type. If the assertion method argument satisfies the condition, 844 | /// then the execution continues. Otherwise, execution is assumed to be halted. 845 | /// 846 | public enum AssertionConditionType 847 | { 848 | /// Marked parameter should be evaluated to true. 849 | IS_TRUE = 0, 850 | /// Marked parameter should be evaluated to false. 851 | IS_FALSE = 1, 852 | /// Marked parameter should be evaluated to null value. 853 | IS_NULL = 2, 854 | /// Marked parameter should be evaluated to not null value. 855 | IS_NOT_NULL = 3, 856 | } 857 | 858 | /// 859 | /// Indicates that the marked method unconditionally terminates control flow execution. 860 | /// For example, it could unconditionally throw exception. 861 | /// 862 | [Obsolete("Use [ContractAnnotation('=> halt')] instead")] 863 | [AttributeUsage(AttributeTargets.Method)] 864 | public sealed class TerminatesProgramAttribute : Attribute { } 865 | 866 | /// 867 | /// Indicates that method is pure LINQ method, with postponed enumeration (like Enumerable.Select, 868 | /// .Where). This annotation allows inference of [InstantHandle] annotation for parameters 869 | /// of delegate type by analyzing LINQ method chains. 870 | /// 871 | [AttributeUsage(AttributeTargets.Method)] 872 | public sealed class LinqTunnelAttribute : Attribute { } 873 | 874 | /// 875 | /// Indicates that IEnumerable, passed as parameter, is not enumerated. 876 | /// 877 | [AttributeUsage(AttributeTargets.Parameter)] 878 | public sealed class NoEnumerationAttribute : Attribute { } 879 | 880 | /// 881 | /// Indicates that parameter is regular expression pattern. 882 | /// 883 | [AttributeUsage(AttributeTargets.Parameter)] 884 | public sealed class RegexPatternAttribute : Attribute { } 885 | 886 | /// 887 | /// XAML attribute. Indicates the type that has ItemsSource property and should be treated 888 | /// as ItemsControl-derived type, to enable inner items DataContext type resolve. 889 | /// 890 | [AttributeUsage(AttributeTargets.Class)] 891 | public sealed class XamlItemsControlAttribute : Attribute { } 892 | 893 | /// 894 | /// XAML attribute. Indicates the property of some BindingBase-derived type, that 895 | /// is used to bind some item of ItemsControl-derived type. This annotation will 896 | /// enable the DataContext type resolve for XAML bindings for such properties. 897 | /// 898 | /// 899 | /// Property should have the tree ancestor of the ItemsControl type or 900 | /// marked with the attribute. 901 | /// 902 | [AttributeUsage(AttributeTargets.Property)] 903 | public sealed class XamlItemBindingOfItemsControlAttribute : Attribute { } 904 | 905 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] 906 | public sealed class AspChildControlTypeAttribute : Attribute 907 | { 908 | public AspChildControlTypeAttribute(string tagName, Type controlType) 909 | { 910 | TagName = tagName; 911 | ControlType = controlType; 912 | } 913 | 914 | public string TagName { get; private set; } 915 | public Type ControlType { get; private set; } 916 | } 917 | 918 | [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] 919 | public sealed class AspDataFieldAttribute : Attribute { } 920 | 921 | [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] 922 | public sealed class AspDataFieldsAttribute : Attribute { } 923 | 924 | [AttributeUsage(AttributeTargets.Property)] 925 | public sealed class AspMethodPropertyAttribute : Attribute { } 926 | 927 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] 928 | public sealed class AspRequiredAttributeAttribute : Attribute 929 | { 930 | public AspRequiredAttributeAttribute([NotNull] string attribute) 931 | { 932 | Attribute = attribute; 933 | } 934 | 935 | public string Attribute { get; private set; } 936 | } 937 | 938 | [AttributeUsage(AttributeTargets.Property)] 939 | public sealed class AspTypePropertyAttribute : Attribute 940 | { 941 | public bool CreateConstructorReferences { get; private set; } 942 | 943 | public AspTypePropertyAttribute(bool createConstructorReferences) 944 | { 945 | CreateConstructorReferences = createConstructorReferences; 946 | } 947 | } 948 | 949 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 950 | public sealed class RazorImportNamespaceAttribute : Attribute 951 | { 952 | public RazorImportNamespaceAttribute(string name) 953 | { 954 | Name = name; 955 | } 956 | 957 | public string Name { get; private set; } 958 | } 959 | 960 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] 961 | public sealed class RazorInjectionAttribute : Attribute 962 | { 963 | public RazorInjectionAttribute(string type, string fieldName) 964 | { 965 | Type = type; 966 | FieldName = fieldName; 967 | } 968 | 969 | public string Type { get; private set; } 970 | public string FieldName { get; private set; } 971 | } 972 | 973 | [AttributeUsage(AttributeTargets.Method)] 974 | public sealed class RazorHelperCommonAttribute : Attribute { } 975 | 976 | [AttributeUsage(AttributeTargets.Property)] 977 | public sealed class RazorLayoutAttribute : Attribute { } 978 | 979 | [AttributeUsage(AttributeTargets.Method)] 980 | public sealed class RazorWriteLiteralMethodAttribute : Attribute { } 981 | 982 | [AttributeUsage(AttributeTargets.Method)] 983 | public sealed class RazorWriteMethodAttribute : Attribute { } 984 | 985 | [AttributeUsage(AttributeTargets.Parameter)] 986 | public sealed class RazorWriteMethodParameterAttribute : Attribute { } 987 | 988 | /// 989 | /// Prevents the Member Reordering feature from tossing members of the marked class. 990 | /// 991 | /// 992 | /// The attribute must be mentioned in your member reordering patterns 993 | /// 994 | [AttributeUsage(AttributeTargets.All)] 995 | public sealed class NoReorder : Attribute { } 996 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Resources; 2 | using System.Reflection; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | 6 | // General Information about an assembly is controlled through the following 7 | // set of attributes. Change these attribute values to modify the information 8 | // associated with an assembly. 9 | [assembly: AssemblyTitle("VirtualizedData")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("VirtualizedData")] 14 | [assembly: AssemblyCopyright("Copyright © 2014")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | [assembly: NeutralResourcesLanguage("en")] 18 | 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Build and Revision Numbers 27 | // by using the '*' as shown below: 28 | // [assembly: AssemblyVersion("1.0.*")] 29 | [assembly: AssemblyVersion("1.0.0.0")] 30 | [assembly: AssemblyFileVersion("1.0.0.0")] 31 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Services/IDataService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | 4 | namespace VirtualizedData.Services 5 | { 6 | public interface IDataService 7 | { 8 | Task GetItemsAsync(string searchQuery, int page, CancellationToken cancellationToken = default (CancellationToken)); 9 | } 10 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Services/Movie.cs: -------------------------------------------------------------------------------- 1 | namespace VirtualizedData.Services 2 | { 3 | public class Movie 4 | { 5 | public string Title { get; set; } 6 | public string Year { get; set; } 7 | public string imdbID { get; set; } 8 | public string Type { get; set; } 9 | public string Poster { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Services/MovieResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Newtonsoft.Json; 3 | 4 | namespace VirtualizedData.Services 5 | { 6 | public class MovieResponse 7 | { 8 | [JsonProperty("Search")] 9 | public List Movies { get; set; } 10 | public int TotalResults { get; set; } 11 | public bool Response { get; set; } 12 | public int RemainingPages { get; set; } 13 | } 14 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/Services/MovieService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Http; 3 | using System.Threading; 4 | using System.Threading.Tasks; 5 | using Newtonsoft.Json; 6 | 7 | namespace VirtualizedData.Services 8 | { 9 | public class MovieService : IDataService 10 | { 11 | /// 12 | /// The page size for omdapi is 10 13 | /// 14 | public const int PageSize = 10; 15 | 16 | public async Task GetItemsAsync(string searchQuery, int page, CancellationToken cancellationToken = default (CancellationToken)) 17 | { 18 | HttpClient client = new HttpClient(); 19 | var requestUri = new Uri($"http://www.omdbapi.com/?s={searchQuery}&page={page}"); 20 | var response = await client.GetAsync(requestUri, cancellationToken); 21 | var readAsStringAsync = await response.Content.ReadAsStringAsync(); 22 | MovieResponse movieResponse = JsonConvert.DeserializeObject(readAsStringAsync); 23 | movieResponse.RemainingPages = (movieResponse.TotalResults/PageSize) - page; 24 | return movieResponse; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/ViewModels/MovieViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace VirtualizedData.ViewModels 2 | { 3 | public class MovieViewModel 4 | { 5 | public string Title { get; set; } 6 | public string ImageUrl { get; set; } 7 | public string Year { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/ViewModels/MoviesViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.ComponentModel; 5 | using System.Diagnostics; 6 | using System.Reactive.Disposables; 7 | using System.Reactive.Linq; 8 | using System.Runtime.CompilerServices; 9 | using System.Threading.Tasks; 10 | using System.Windows.Input; 11 | using DynamicData; 12 | using DynamicData.Binding; 13 | using VirtualizedData.Annotations; 14 | using VirtualizedData.Services; 15 | using Xamarin.Forms; 16 | 17 | namespace VirtualizedData.ViewModels 18 | { 19 | public class MoviesViewModel : INotifyPropertyChanged, IDisposable 20 | { 21 | private readonly CompositeDisposable _cds = new CompositeDisposable(); 22 | private readonly ReadOnlyObservableCollection _movies; 23 | private readonly IMoviesModel _moviesModel; 24 | private bool _isBusy; 25 | private int _lastLoadedPage; 26 | private bool _morePagesAvailable; 27 | private string _searchText; 28 | private MovieViewModel _selectedMovie; 29 | 30 | public MoviesViewModel(IMoviesModel moviesModel) 31 | { 32 | _moviesModel = moviesModel; 33 | _cds.Add(_moviesModel.RemainingPages.Subscribe(OnRemainingPagesChanged)); 34 | var itemsObservable = _moviesModel.Movies.Connect(); 35 | var operations = itemsObservable 36 | .Transform(CreateEntryViewModel) 37 | .Bind(out _movies) 38 | .Subscribe(); 39 | _cds.Add(operations); 40 | 41 | // Throttle search for 100ms 42 | var searchTextChanged = Observable.FromEventPattern( 43 | ev => PropertyChanged += ev, 44 | ev => PropertyChanged -= ev) 45 | .Where(ev => ev.EventArgs.PropertyName == "SearchText") 46 | .Throttle(TimeSpan.FromMilliseconds(100)) 47 | .Select(args => SearchText); 48 | 49 | _cds.Add(searchTextChanged.Subscribe(pattern => Search())); 50 | } 51 | 52 | public ReadOnlyObservableCollection Movies => _movies; 53 | 54 | public MovieViewModel SelectedMovie 55 | { 56 | get { return _selectedMovie; } 57 | set 58 | { 59 | _selectedMovie = value; 60 | OnPropertyChanged(nameof(SelectedMovie)); 61 | } 62 | } 63 | 64 | public ICommand LoadNextPageCommand 65 | { 66 | get { return new Command(async () => await LoadPage(_lastLoadedPage + 1)); } 67 | } 68 | 69 | public ICommand SearchCommand => new Command(Search); 70 | 71 | public bool IsBusy 72 | { 73 | get { return _isBusy; } 74 | private set 75 | { 76 | _isBusy = value; 77 | OnPropertyChanged(nameof(IsBusy)); 78 | } 79 | } 80 | 81 | public bool MorePagesAvailable 82 | { 83 | get { return _morePagesAvailable; } 84 | private set 85 | { 86 | _morePagesAvailable = value; 87 | OnPropertyChanged(nameof(MorePagesAvailable)); 88 | } 89 | } 90 | 91 | public string SearchText 92 | { 93 | get { return _searchText; } 94 | set 95 | { 96 | if (_searchText == value) 97 | return; 98 | _searchText = value; 99 | OnPropertyChanged(nameof(SearchText)); 100 | } 101 | } 102 | 103 | public void Dispose() 104 | { 105 | _cds.Dispose(); 106 | } 107 | 108 | public event PropertyChangedEventHandler PropertyChanged; 109 | 110 | private void OnRemainingPagesChanged(int remainingPages) 111 | { 112 | MorePagesAvailable = remainingPages != 0; 113 | } 114 | 115 | private void Search() 116 | { 117 | Task.Run(async () => 118 | { 119 | try 120 | { 121 | IsBusy = true; 122 | await _moviesModel.GetPage(_searchText, 1); 123 | _lastLoadedPage = 1; 124 | IsBusy = false; 125 | } 126 | catch (Exception e) 127 | { 128 | Debug.WriteLine("Something went wrong while searching for movie"); 129 | } 130 | }); 131 | } 132 | 133 | public async Task LoadPage(int pageNumber) 134 | { 135 | IsBusy = true; 136 | await _moviesModel.GetPage(_searchText, pageNumber); 137 | _lastLoadedPage = pageNumber; 138 | Debug.WriteLine("Current page: " + pageNumber); 139 | IsBusy = false; 140 | } 141 | 142 | private MovieViewModel CreateEntryViewModel(Movie movie) 143 | { 144 | return new MovieViewModel {ImageUrl = movie.Poster, Title = movie.Title, Year = movie.Year}; 145 | } 146 | 147 | [NotifyPropertyChangedInvocator] 148 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 149 | { 150 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 151 | } 152 | } 153 | } -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/VirtualizedData.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 10.0 6 | Debug 7 | AnyCPU 8 | {020A0854-8260-4F30-A643-724DECC4CA40} 9 | Library 10 | Properties 11 | VirtualizedData 12 | VirtualizedData 13 | v4.5 14 | Profile111 15 | 512 16 | {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 17 | 18 | 19 | 20 | 21 | true 22 | full 23 | false 24 | bin\Debug\ 25 | DEBUG;TRACE 26 | prompt 27 | 4 28 | 29 | 30 | pdbonly 31 | true 32 | bin\Release\ 33 | TRACE 34 | prompt 35 | 4 36 | 37 | 38 | 39 | 40 | 41 | 42 | MoviesPage.xaml 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | ..\..\packages\DynamicData.4.6.0.1132\lib\portable-net45+winrt45+wp8+wpa81\DynamicData.dll 56 | True 57 | 58 | 59 | ..\..\packages\Newtonsoft.Json.8.0.3\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll 60 | True 61 | 62 | 63 | ..\..\packages\Rx-Core.2.2.5\lib\portable-net45+winrt45+wp8+wpa81\System.Reactive.Core.dll 64 | True 65 | 66 | 67 | ..\..\packages\Rx-Interfaces.2.2.5\lib\portable-net45+winrt45+wp8+wpa81\System.Reactive.Interfaces.dll 68 | True 69 | 70 | 71 | ..\..\packages\Rx-Linq.2.2.5\lib\portable-net45+winrt45+wp8+wpa81\System.Reactive.Linq.dll 72 | True 73 | 74 | 75 | ..\..\packages\Rx-PlatformServices.2.2.5\lib\portable-net45+winrt45+wp8+wpa81\System.Reactive.PlatformServices.dll 76 | True 77 | 78 | 79 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll 80 | True 81 | 82 | 83 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll 84 | True 85 | 86 | 87 | ..\..\packages\Xamarin.Forms.2.2.0.31\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dll 88 | True 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | MSBuild:UpdateDesignTimeXaml 97 | Designer 98 | 99 | 100 | 101 | 102 | 103 | 104 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 105 | 106 | 107 | 108 | 115 | -------------------------------------------------------------------------------- /VirtualizedData/VirtualizedData/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | --------------------------------------------------------------------------------