├── .github ├── ISSUE_TEMPLATE.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Doc ├── Img │ ├── 2017-12-25_11-28-43.png │ ├── 2017-12-25_11-29-38.png │ ├── 2017-12-25_11-31-10.png │ ├── 2017-12-25_11-31-59.png │ ├── 2017-12-25_11-33-09.png │ ├── 2017-12-25_11-33-36.png │ ├── 2017-12-25_11-40-33.png │ ├── 2017-12-25_11-41-25.png │ ├── 2017-12-25_12-14-21.png │ ├── 2017-12-25_12-15-02.png │ ├── 2017-12-25_12-22-15.png │ ├── 2017-12-25_12-23-13.png │ ├── 2017-12-25_12-24-48.png │ ├── 2017-12-25_12-25-55.png │ ├── 2017-12-25_12-51-53.png │ ├── 2017-12-25_12-55-16.png │ ├── 2017-12-27_14-26-46.png │ ├── 2018-01-03_14-40-53.png │ ├── 2018-01-04_11-14-39.png │ ├── 2018-01-04_11-15-00.png │ ├── 2018-01-04_11-30-09.png │ ├── 2018-01-04_11-32-51.png │ ├── 2018-01-04_11-34-15.png │ ├── 2018-01-04_11-34-46.png │ ├── 2018-01-04_11-35-04.png │ ├── 2018-01-04_11-35-45.png │ ├── 2018-01-04_15-18-41.png │ ├── 2018-01-04_15-19-44.png │ ├── 2018-01-04_15-24-40.png │ ├── 2018-01-04_15-25-17.png │ ├── 2018-01-04_15-26-08.png │ ├── 2018-01-04_15-30-54.png │ ├── 2018-01-04_20-33-16.png │ ├── 2018-01-04_20-33-37.png │ ├── 2018-01-04_20-35-52.png │ ├── 2018-01-05_13-43-24.png │ ├── 2018-01-08_09-53-48.png │ ├── 2018-01-08_16-12-08.png │ ├── 2018-01-08_17-23-14.png │ ├── 2018-01-08_17-43-56.png │ ├── 2018-01-08_17-45-48.png │ ├── 2018-01-08_18-06-01.png │ ├── 2018-01-14_10-57-00.png │ ├── 2018-01-15_15-01-00.png │ ├── 2018-01-15_15-57-00.png │ ├── 2018-01-15_16-15-00.png │ └── Azure-Functions-Logo.png ├── creating-vs.md ├── creating.md ├── first-client.md ├── implementing.md ├── refactoring-client.md ├── refactoring.md └── second-client.md ├── LICENSE.md ├── LbCalculator ├── Calculator.Data │ ├── AdditionResult.cs │ └── Calculator.Data.csproj ├── LbCalculator.sln └── LbCalculator │ ├── .gitignore │ ├── Add.cs │ ├── LbCalculator.csproj │ └── host.json ├── README.md ├── Snippets.vssettings ├── XamCalculator - Start ├── XamCalculator.sln └── XamCalculator │ ├── XamCalculator.Android │ ├── Assets │ │ └── AboutAssets.txt │ ├── MainActivity.cs │ ├── Properties │ │ ├── AndroidManifest.xml │ │ └── AssemblyInfo.cs │ ├── Resources │ │ ├── AboutResources.txt │ │ ├── Resource.designer.cs │ │ ├── drawable-hdpi │ │ │ └── icon.png │ │ ├── drawable-xhdpi │ │ │ └── icon.png │ │ ├── drawable-xxhdpi │ │ │ └── icon.png │ │ ├── drawable │ │ │ └── icon.png │ │ ├── layout │ │ │ ├── Main.axml │ │ │ ├── Tabbar.axml │ │ │ └── Toolbar.axml │ │ ├── mipmap-hdpi │ │ │ └── Icon.png │ │ ├── mipmap-mdpi │ │ │ └── Icon.png │ │ ├── mipmap-xhdpi │ │ │ └── Icon.png │ │ ├── mipmap-xxhdpi │ │ │ └── Icon.png │ │ ├── mipmap-xxxhdpi │ │ │ └── Icon.png │ │ └── values │ │ │ ├── Strings.xml │ │ │ └── styles.xml │ └── XamCalculator.Android.csproj │ ├── XamCalculator.UWP │ ├── App.xaml │ ├── App.xaml.cs │ ├── Assets │ │ ├── LockScreenLogo.scale-100.png │ │ ├── LockScreenLogo.scale-125.png │ │ ├── LockScreenLogo.scale-150.png │ │ ├── LockScreenLogo.scale-200.png │ │ ├── LockScreenLogo.scale-400.png │ │ ├── SplashScreen.scale-100.png │ │ ├── SplashScreen.scale-125.png │ │ ├── SplashScreen.scale-150.png │ │ ├── SplashScreen.scale-200.png │ │ ├── SplashScreen.scale-400.png │ │ ├── Square150x150Logo.scale-100.png │ │ ├── Square150x150Logo.scale-125.png │ │ ├── Square150x150Logo.scale-150.png │ │ ├── Square150x150Logo.scale-200.png │ │ ├── Square150x150Logo.scale-400.png │ │ ├── Square44x44Logo.scale-100.png │ │ ├── Square44x44Logo.scale-125.png │ │ ├── Square44x44Logo.scale-150.png │ │ ├── Square44x44Logo.scale-200.png │ │ ├── Square44x44Logo.scale-400.png │ │ ├── Square44x44Logo.targetsize-16_altform-unplated.png │ │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ │ ├── Square44x44Logo.targetsize-256_altform-unplated.png │ │ ├── Square44x44Logo.targetsize-32_altform-unplated.png │ │ ├── Square44x44Logo.targetsize-48_altform-unplated.png │ │ ├── StoreLogo.png │ │ ├── Wide310x150Logo.scale-100.png │ │ ├── Wide310x150Logo.scale-125.png │ │ ├── Wide310x150Logo.scale-150.png │ │ ├── Wide310x150Logo.scale-200.png │ │ └── Wide310x150Logo.scale-400.png │ ├── MainPage.xaml │ ├── MainPage.xaml.cs │ ├── Package.appxmanifest │ ├── Properties │ │ ├── AssemblyInfo.cs │ │ └── Default.rd.xml │ └── XamCalculator.UWP.csproj │ ├── XamCalculator.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 │ ├── XamCalculator.iOS.csproj │ └── packages.config │ └── XamCalculator │ ├── App.xaml │ ├── App.xaml.cs │ ├── MainPage.xaml │ ├── MainPage.xaml.cs │ └── XamCalculator.csproj └── XamCalculator ├── XamCalculator.sln └── XamCalculator ├── XamCalculator.Android ├── Assets │ └── AboutAssets.txt ├── MainActivity.cs ├── Properties │ ├── AndroidManifest.xml │ └── AssemblyInfo.cs ├── Resources │ ├── AboutResources.txt │ ├── Resource.designer.cs │ ├── drawable-hdpi │ │ └── icon.png │ ├── drawable-xhdpi │ │ └── icon.png │ ├── drawable-xxhdpi │ │ └── icon.png │ ├── drawable │ │ └── icon.png │ ├── layout │ │ ├── Main.axml │ │ ├── Tabbar.axml │ │ └── Toolbar.axml │ ├── mipmap-hdpi │ │ └── Icon.png │ ├── mipmap-mdpi │ │ └── Icon.png │ ├── mipmap-xhdpi │ │ └── Icon.png │ ├── mipmap-xxhdpi │ │ └── Icon.png │ ├── mipmap-xxxhdpi │ │ └── Icon.png │ └── values │ │ ├── Strings.xml │ │ └── styles.xml └── XamCalculator.Android.csproj ├── XamCalculator.UWP ├── App.xaml ├── App.xaml.cs ├── Assets │ ├── LockScreenLogo.scale-100.png │ ├── LockScreenLogo.scale-125.png │ ├── LockScreenLogo.scale-150.png │ ├── LockScreenLogo.scale-200.png │ ├── LockScreenLogo.scale-400.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16_altform-unplated.png │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── Square44x44Logo.targetsize-256_altform-unplated.png │ ├── Square44x44Logo.targetsize-32_altform-unplated.png │ ├── Square44x44Logo.targetsize-48_altform-unplated.png │ ├── StoreLogo.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ └── Wide310x150Logo.scale-400.png ├── MainPage.xaml ├── MainPage.xaml.cs ├── Package.appxmanifest ├── Properties │ ├── AssemblyInfo.cs │ └── Default.rd.xml └── XamCalculator.UWP.csproj ├── XamCalculator.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 ├── XamCalculator.iOS.csproj └── packages.config └── XamCalculator ├── App.xaml ├── App.xaml.cs ├── MainPage.xaml ├── MainPage.xaml.cs └── XamCalculator.csproj /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 4 | > Please provide us with the following information: 5 | > --------------------------------------------------------------- 6 | 7 | ### This issue is for a: (mark with an `x`) 8 | ``` 9 | - [ ] bug report -> please search issues before submitting 10 | - [ ] feature request 11 | - [ ] documentation issue or request 12 | - [ ] regression (a behavior that used to work and stopped in a new release) 13 | ``` 14 | 15 | ### Minimal steps to reproduce 16 | > 17 | 18 | ### Any log messages given by the failure 19 | > 20 | 21 | ### Expected/desired behavior 22 | > 23 | 24 | ### OS and Version? 25 | > Windows 7, 8 or 10. Linux (which distribution). macOS (Yosemite? El Capitan? Sierra?) 26 | 27 | ### Versions 28 | > 29 | 30 | ### Mention any other details that might be useful 31 | 32 | > --------------------------------------------------------------- 33 | > Thanks! We'll be in touch soon. 34 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Purpose 2 | 3 | * ... 4 | 5 | ## Does this introduce a breaking change? 6 | 7 | ``` 8 | [ ] Yes 9 | [ ] No 10 | ``` 11 | 12 | ## Pull Request Type 13 | What kind of change does this Pull Request introduce? 14 | 15 | 16 | ``` 17 | [ ] Bugfix 18 | [ ] Feature 19 | [ ] Code style update (formatting, local variables) 20 | [ ] Refactoring (no functional changes, no api changes) 21 | [ ] Documentation content changes 22 | [ ] Other... Please describe: 23 | ``` 24 | 25 | ## How to Test 26 | * Get the code 27 | 28 | ``` 29 | git clone [repo-address] 30 | cd [repo-name] 31 | git checkout [branch-name] 32 | npm install 33 | ``` 34 | 35 | * Test the code 36 | 37 | ``` 38 | ``` 39 | 40 | ## What to Check 41 | Verify that the following are valid 42 | * ... 43 | 44 | ## Other Information 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # MSTest test Results 33 | [Tt]est[Rr]esult*/ 34 | [Bb]uild[Ll]og.* 35 | 36 | # NUNIT 37 | *.VisualState.xml 38 | TestResult.xml 39 | 40 | # Build Results of an ATL Project 41 | [Dd]ebugPS/ 42 | [Rr]eleasePS/ 43 | dlldata.c 44 | 45 | # .NET Core 46 | project.lock.json 47 | project.fragment.lock.json 48 | artifacts/ 49 | **/Properties/launchSettings.json 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | *.VC.db 88 | *.VC.VC.opendb 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # Visual Studio code coverage results 117 | *.coverage 118 | *.coveragexml 119 | 120 | # NCrunch 121 | _NCrunch_* 122 | .*crunch*.local.xml 123 | nCrunchTemp_* 124 | 125 | # MightyMoose 126 | *.mm.* 127 | AutoTest.Net/ 128 | 129 | # Web workbench (sass) 130 | .sass-cache/ 131 | 132 | # Installshield output folder 133 | [Ee]xpress/ 134 | 135 | # DocProject is a documentation generator add-in 136 | DocProject/buildhelp/ 137 | DocProject/Help/*.HxT 138 | DocProject/Help/*.HxC 139 | DocProject/Help/*.hhc 140 | DocProject/Help/*.hhk 141 | DocProject/Help/*.hhp 142 | DocProject/Help/Html2 143 | DocProject/Help/html 144 | 145 | # Click-Once directory 146 | publish/ 147 | 148 | # Publish Web Output 149 | *.[Pp]ublish.xml 150 | *.azurePubxml 151 | # TODO: Comment the next line if you want to checkin your web deploy settings 152 | # but database connection strings (with potential passwords) will be unencrypted 153 | *.pubxml 154 | *.publishproj 155 | 156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 | # checkin your Azure Web App publish settings, but sensitive information contained 158 | # in these scripts will be unencrypted 159 | PublishScripts/ 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/* 165 | # except build/, which is used as an MSBuild target. 166 | !**/packages/build/ 167 | # Uncomment if necessary however generally it will be regenerated when needed 168 | #!**/packages/repositories.config 169 | # NuGet v3's project.json files produces more ignorable files 170 | *.nuget.props 171 | *.nuget.targets 172 | 173 | # Microsoft Azure Build Output 174 | csx/ 175 | *.build.csdef 176 | 177 | # Microsoft Azure Emulator 178 | ecf/ 179 | rcf/ 180 | 181 | # Windows Store app package directories and files 182 | AppPackages/ 183 | BundleArtifacts/ 184 | Package.StoreAssociation.xml 185 | _pkginfo.txt 186 | 187 | # Visual Studio cache files 188 | # files ending in .cache can be ignored 189 | *.[Cc]ache 190 | # but keep track of directories ending in .cache 191 | !*.[Cc]ache/ 192 | 193 | # Others 194 | ClientBin/ 195 | ~$* 196 | *~ 197 | *.dbmdl 198 | *.dbproj.schemaview 199 | *.jfm 200 | *.pfx 201 | *.publishsettings 202 | orleans.codegen.cs 203 | 204 | # Since there are multiple workflows, uncomment next line to ignore bower_components 205 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 206 | #bower_components/ 207 | 208 | # RIA/Silverlight projects 209 | Generated_Code/ 210 | 211 | # Backup & report files from converting an old project file 212 | # to a newer Visual Studio version. Backup files are not needed, 213 | # because we have git ;-) 214 | _UpgradeReport_Files/ 215 | Backup*/ 216 | UpgradeLog*.XML 217 | UpgradeLog*.htm 218 | 219 | # SQL Server files 220 | *.mdf 221 | *.ldf 222 | *.ndf 223 | 224 | # Business Intelligence projects 225 | *.rdl.data 226 | *.bim.layout 227 | *.bim_*.settings 228 | 229 | # Microsoft Fakes 230 | FakesAssemblies/ 231 | 232 | # GhostDoc plugin setting file 233 | *.GhostDoc.xml 234 | 235 | # Node.js Tools for Visual Studio 236 | .ntvs_analysis.dat 237 | node_modules/ 238 | 239 | # Typescript v1 declaration files 240 | typings/ 241 | 242 | # Visual Studio 6 build log 243 | *.plg 244 | 245 | # Visual Studio 6 workspace options file 246 | *.opt 247 | 248 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 249 | *.vbw 250 | 251 | # Visual Studio LightSwitch build output 252 | **/*.HTMLClient/GeneratedArtifacts 253 | **/*.DesktopClient/GeneratedArtifacts 254 | **/*.DesktopClient/ModelManifest.xml 255 | **/*.Server/GeneratedArtifacts 256 | **/*.Server/ModelManifest.xml 257 | _Pvt_Extensions 258 | 259 | # Paket dependency manager 260 | .paket/paket.exe 261 | paket-files/ 262 | 263 | # FAKE - F# Make 264 | .fake/ 265 | 266 | # JetBrains Rider 267 | .idea/ 268 | *.sln.iml 269 | 270 | # CodeRush 271 | .cr/ 272 | 273 | # Python Tools for Visual Studio (PTVS) 274 | __pycache__/ 275 | *.pyc 276 | 277 | # Cake - Uncomment if you are using it 278 | # tools/** 279 | # !tools/packages.config 280 | 281 | # Telerik's JustMock configuration file 282 | *.jmconfig 283 | 284 | # BizTalk build output 285 | *.btp.cs 286 | *.btm.cs 287 | *.odx.cs 288 | *.xsd.cs 289 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [project-title] Changelog 2 | 3 | 4 | # x.y.z (yyyy-mm-dd) 5 | 6 | *Features* 7 | * ... 8 | 9 | *Bug Fixes* 10 | * ... 11 | 12 | *Breaking Changes* 13 | * ... 14 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to [project-title] 2 | 3 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 4 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 5 | the rights to use your contribution. For details, visit https://cla.microsoft.com. 6 | 7 | When you submit a pull request, a CLA-bot will automatically determine whether you need to provide 8 | a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions 9 | provided by the bot. You will only need to do this once across all repos using our CLA. 10 | 11 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 12 | For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or 13 | contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 14 | 15 | - [Code of Conduct](#coc) 16 | - [Issues and Bugs](#issue) 17 | - [Feature Requests](#feature) 18 | - [Submission Guidelines](#submit) 19 | 20 | ## Code of Conduct 21 | Help us keep this project open and inclusive. Please read and follow our [Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 22 | 23 | ## Found an Issue? 24 | If you find a bug in the source code or a mistake in the documentation, you can help us by 25 | [submitting an issue](#submit-issue) to the GitHub Repository. Even better, you can 26 | [submit a Pull Request](#submit-pr) with a fix. 27 | 28 | ## Want a Feature? 29 | You can *request* a new feature by [submitting an issue](#submit-issue) to the GitHub 30 | Repository. If you would like to *implement* a new feature, please submit an issue with 31 | a proposal for your work first, to be sure that we can use it. 32 | 33 | * **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr). 34 | 35 | ## Submission Guidelines 36 | 37 | ### Submitting an Issue 38 | Before you submit an issue, search the archive, maybe your question was already answered. 39 | 40 | If your issue appears to be a bug, and hasn't been reported, open a new issue. 41 | Help us to maximize the effort we can spend fixing issues and adding new 42 | features, by not reporting duplicate issues. Providing the following information will increase the 43 | chances of your issue being dealt with quickly: 44 | 45 | * **Overview of the Issue** - if an error is being thrown a non-minified stack trace helps 46 | * **Version** - what version is affected (e.g. 0.1.2) 47 | * **Motivation for or Use Case** - explain what are you trying to do and why the current behavior is a bug for you 48 | * **Browsers and Operating System** - is this a problem with all browsers? 49 | * **Reproduce the Error** - provide a live example or a unambiguous set of steps 50 | * **Related Issues** - has a similar issue been reported before? 51 | * **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be 52 | causing the problem (line of code or commit) 53 | 54 | You can file new issues by providing the above information at the corresponding repository's issues link: https://github.com/[organization-name]/[repository-name]/issues/new]. 55 | 56 | ### Submitting a Pull Request (PR) 57 | Before you submit your Pull Request (PR) consider the following guidelines: 58 | 59 | * Search the repository (https://github.com/[organization-name]/[repository-name]/pulls) for an open or closed PR 60 | that relates to your submission. You don't want to duplicate effort. 61 | 62 | * Make your changes in a new git fork: 63 | 64 | * Commit your changes using a descriptive commit message 65 | * Push your fork to GitHub: 66 | * In GitHub, create a pull request 67 | * If we suggest changes then: 68 | * Make the required updates. 69 | * Rebase your fork and force push to your GitHub repository (this will update your Pull Request): 70 | 71 | ```shell 72 | git rebase master -i 73 | git push -f 74 | ``` 75 | 76 | That's it! Thank you for your contribution! 77 | -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-28-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-28-43.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-29-38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-29-38.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-31-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-31-10.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-31-59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-31-59.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-33-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-33-09.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-33-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-33-36.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-40-33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-40-33.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_11-41-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_11-41-25.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-14-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-14-21.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-15-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-15-02.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-22-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-22-15.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-23-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-23-13.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-24-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-24-48.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-25-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-25-55.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-51-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-51-53.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-25_12-55-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-25_12-55-16.png -------------------------------------------------------------------------------- /Doc/Img/2017-12-27_14-26-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2017-12-27_14-26-46.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-03_14-40-53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-03_14-40-53.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-14-39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-14-39.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-15-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-15-00.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-30-09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-30-09.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-32-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-32-51.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-34-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-34-15.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-34-46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-34-46.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-35-04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-35-04.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_11-35-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_11-35-45.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_15-18-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_15-18-41.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_15-19-44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_15-19-44.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_15-24-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_15-24-40.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_15-25-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_15-25-17.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_15-26-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_15-26-08.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_15-30-54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_15-30-54.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_20-33-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_20-33-16.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_20-33-37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_20-33-37.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-04_20-35-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-04_20-35-52.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-05_13-43-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-05_13-43-24.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-08_09-53-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-08_09-53-48.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-08_16-12-08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-08_16-12-08.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-08_17-23-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-08_17-23-14.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-08_17-43-56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-08_17-43-56.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-08_17-45-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-08_17-45-48.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-08_18-06-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-08_18-06-01.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-14_10-57-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-14_10-57-00.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-15_15-01-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-15_15-01-00.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-15_15-57-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-15_15-57-00.png -------------------------------------------------------------------------------- /Doc/Img/2018-01-15_16-15-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/2018-01-15_16-15-00.png -------------------------------------------------------------------------------- /Doc/Img/Azure-Functions-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Azure-Samples/functions-xamarin-getting-started/a2f9a2486fb56716184d66dc48c75f3e8afb67f0/Doc/Img/Azure-Functions-Logo.png -------------------------------------------------------------------------------- /Doc/creating.md: -------------------------------------------------------------------------------- 1 | # Creating the Azure Function in the Azure Web Portal 2 | 3 | In this section, we will build the Azure Functions application in the Azure web portal and then add an HTTP Triggered function. This will allow us to call the function from the Xamarin client, for example with an [HttpClient](http://gslb.ch/a75a-xamfunc18) instance. 4 | 5 | > Note: If you prefer, you can create the Azure Function in Visual Studio 2017 instead. [A detailed tutorial can be found here](./creating-vs.md). 6 | 7 | To create the Azure Functions application in the Azure portal, follow these steps: 8 | 9 | 1. Log into the [Azure Portal](http://portal.azure.com) with your user account. 10 | 11 | > Note: You will need an Azure account to create this sample. If you don't have one already, [you can get a free trial account here](http://gslb.ch/a17a-xamfunc18). 12 | 13 | 2. Click the "Create a resource" menu item. 14 | 15 | ![Create a resource](./Img/2017-12-25_11-28-43.png) 16 | 17 | 3. In the Azure Marketplace, select "Serverless Function App". 18 | 19 | ![Serverless Function App](./Img/2017-12-25_11-29-38.png) 20 | 21 | 4. Fill the form with the following data: 22 | 23 | - App Name: This is a unique name for your application. One application can contain multiple functions. 24 | 25 | - Subscription: The subscription to which these functions will be billed. In some cases you will only see one subscription here, but some people have multiple subscriptions associated to their account. 26 | 27 | - Resource group: This is a logical grouping of Azure resources. It makes sense to have one resource group per application, so you can easily locate the resources that you are using. In this case we are creating a new resource group for this application. 28 | 29 | - OS: The operating system of the server on which the functions will run. 30 | 31 | - Hosting plan: This shows how the function usage will be billed. 32 | - Consumption plan means that the function will be billed whenever it is called, and only for the time that it runs. This is the best plan to get started. 33 | - App Service Plan is best after your business starts attracting more users and you need some more predictable billing. 34 | 35 | - Location will be the physical location of the server on which your functions will run. You should choose a server close to your users. 36 | 37 | - Storage: You can either create a new storage account, or use an existing one. Note that this sample doesn't use storage but you still need to specify a storage account. 38 | 39 | > Note: The storage account name should be entered in lower case. 40 | 41 | - Application Insights: If you want to add extra analytics on your functions application, you can switch this on. This provides you with stats about the usage, crash reports, custom events, etc. In this sample we will not use Application Insights. 42 | 43 | ![Creating the function app](./Img/2017-12-25_11-31-10.png) 44 | 45 | 5. Click the Create button. This will trigger the deployment, and you should see a popup like shown below. 46 | 47 | ![Deployment in progress](./Img/2017-12-25_11-31-59.png) 48 | 49 | 6. After a moment, you should see a new notification: Deployment succeeded. You can then click the button to go to the resource, or simply close the notification. 50 | 51 | ![Deployment succeeded](./Img/2017-12-25_11-33-09.png) 52 | 53 | > Note: You can always go back to the application by clicking on the Function Apps menu item on the left-hand side. 54 | 55 | ![Function Apps menu item](./Img/2017-12-25_11-33-36.png) 56 | 57 | 7. Once you are in the Functions Apps section in the portal, expand the application itself. Next to the "Functions" submenu, click on the "+" sign when you hover over the submenu. 58 | 59 | ![Application submenus](./Img/2017-12-25_11-40-33.png) 60 | 61 | Now we need to choose what will *trigger* the function that we will create. There are a large number of triggers available and we cannot review all of them here, but there is [documentation available on our Docs website](http://gslb.ch/a63a-xamfunc18). The most common triggers are: 62 | 63 | - [HTTP Trigger](http://gslb.ch/a65a-xamfunc18): The function will be executed when an HTTP request arrives. This is the type of trigger we will use. 64 | - [Timer trigger](http://gslb.ch/a66a-xamfunc18): The function is executed every interval of time, where the interval is specified [by a CRON expression](https://en.wikipedia.org/wiki/Cron#CRON_expression). 65 | - [Blob trigger](http://gslb.ch/a64a-xamfunc18): The function is executed when a file is uploaded to a given blob container 66 | - [and more...](http://gslb.ch/a63a-xamfunc18) 67 | 68 | 8. Click on the "Custom function" button as shown below. 69 | 70 | ![Custom function](./Img/2017-12-25_11-41-25.png) 71 | 72 | 9. You will now see a large list of potential triggers, which can be implemented in various languages. Scroll down until you see the "HTTP trigger with parameter". In this sample, we will create the function in C#, so click the corresponding button. 73 | 74 | ![HTTP trigger with parameter](./Img/2017-12-25_12-14-21.png) 75 | 76 | 10. Enter a name for the function (for example "Add") and press Create. 77 | 78 | ![Function creation](./Img/2017-12-25_12-15-02.png) 79 | 80 | 11. The function is created, and some basic implementation is added. Let's test to see how the function works. Since it is an HTTP trigger, we can execute the function by calling a URL. You can get the URL from the top right corner, where the "Get function URL" button is found. 81 | 82 | ![Get function URL](./Img/2017-12-25_12-22-15.png) 83 | 84 | 12. Copy the URL from the popup window. 85 | 86 | ![Function URL](./Img/2017-12-25_12-23-13.png) 87 | 88 | 13. Open a web browser window and paste the link into the location bar. Before you press the Enter key, make sure to replace the ```{name}``` parameter in the URL with your own name. Then press enter and you should see the response "Hello Laurent" appear (except that your own name should be shown instead of Laurent). 89 | 90 | ## Conclusion 91 | 92 | We now have the infrastructure in place for our Azure Function. Once you are a bit more experienced, the process of creating such a function should not take more than a few minutes. 93 | 94 | [In the next section, we will now modify the function's interface and then implement it.](./implementing.md) -------------------------------------------------------------------------------- /Doc/first-client.md: -------------------------------------------------------------------------------- 1 | # Implementing the first version of the Xamarin.Forms client app 2 | 3 | We will start this sample by creating a Xamarin.Forms client app which works offline. Then we will see how we can transfer the business logic of this app to the Azure cloud. 4 | 5 | > Note: If you are already familiar with Xamarin.Forms, you can jump to the next step without fear. You will find the client that we create in this page in [the XamCalculator - Start folder](https://github.com/lbugnion/sample-azure-simplexamarinfunction/tree/master/XamCalculator%20-%20Start). 6 | 7 | The Xamarin client app that we create here is extremely simple and obviously not a real life scenario. However it shows all the steps necessary to creating the client and the server applications, and it should give you a good jumpstart into your own projects and use cases. 8 | 9 | 1. In Visual Studio 2017, select File > New > Project. 10 | 11 | > Note: We use Visual Studio 2017 on Windows for this sample, but you can also create Xamarin.Forms applications in Visual Studio for Mac if you prefer. Xamarin is available for free in all editions of Visual Studio, including the free Community edition, on PC and Mac. 12 | > - [Visual Studio Community Edition for Windows](http://gslb.ch/a72a-xamfunc18) 13 | > - [Visual Studio for Mac](http://gslb.ch/a73a-xamfunc18) 14 | 15 | 2. In the New Project dialog, select the Cross-Platform category, and then Cross-Platform App (Xamarin.Forms) with Visual C#. Name the new application ```XamCalculator```, select a location for the project and press OK. 16 | 17 | ![New Project](./Img/2017-12-25_12-51-53.png) 18 | 19 | > Note: The Cross-platform category is available if you selected the "Mobile development with .NET" workload in the Visual Studio 2017 installer. 20 | 21 | 3. In the New Cross Platform App dialog, select the following settings, then press OK. 22 | - Android, iOS and Windows 23 | - Xamarin.Forms 24 | - .NET Standard 25 | 26 | ![New Cross Platform App](./Img/2017-12-25_12-55-16.png) 27 | 28 | The new application consists of 4 projects: 29 | 30 | - XamCalculator: This is the shared .NET Standard project, where we will implement the UI and the code calling the function. This project is referenced by each of the 3 other projects. 31 | - XamCalculator.Android: The Android version of the application. 32 | - XamCalculator.iOS: The iOS version of the application. 33 | - XamCalculator.UWP: The Universal Windows Platform (UWP) of the application. 34 | 35 | Later we will see how we can select each application to test it and run it. 36 | 37 | 4. In the XamCalculator project, select the MainPage.xaml and open it in the editor. 38 | 39 | 5. Replace the existing XAML with the following: 40 | 41 | ```xml 42 | 43 | 47 | 48 | 50 | 51 | 54 | 55 | 58 | 59 |