├── .gitattributes ├── .gitignore ├── .nuget ├── NuGet.Config ├── NuGet.exe └── NuGet.targets ├── FormsPopup.sln ├── FormsPopup ├── FormsPopup.Droid │ ├── Assets │ │ └── AboutAssets.txt │ ├── FormsPopup.Droid.csproj │ ├── FormsPopup.Droid.csproj.bak │ ├── 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 │ └── packages.config ├── FormsPopup.Examples │ ├── App.cs │ ├── CodedPopupExample.cs │ ├── CodedSimpleExample.cs │ ├── ComplexLayoutExample.xaml │ ├── ComplexLayoutExample.xaml.cs │ ├── FormsPopup.Examples.csproj │ ├── NavigationExample.cs │ ├── Properties │ │ └── AssemblyInfo.cs │ ├── XamlPopupExample.xaml │ ├── XamlPopupExample.xaml.cs │ └── packages.config ├── FormsPopup.iOS │ ├── AppDelegate.cs │ ├── Entitlements.plist │ ├── FormsPopup.iOS.csproj │ ├── 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 │ ├── iTunesArtwork │ ├── iTunesArtwork@2x │ └── packages.config └── FormsPopup │ ├── FormsPopup.csproj │ ├── Popup.cs │ ├── PopupHidingEventArgs.cs │ ├── PopupPage.cs │ ├── PopupPageInitializer.cs │ ├── PopupSectionType.cs │ ├── PopupShowingEventArgs.cs │ ├── PopupTappedEventArgs.cs │ ├── Properties │ └── AssemblyInfo.cs │ ├── TapGestureRecognizerVisitor.cs │ ├── VisualElementExtensions.cs │ └── packages.config ├── LICENSE ├── README.md └── pictures ├── androidPopup.gif ├── gridlayout.png └── iOSPopup.gif /.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 | *.sln.docstates 8 | *.userprefs 9 | 10 | # Build results 11 | [Dd]ebug/ 12 | [Dd]ebugPublic/ 13 | [Rr]elease/ 14 | x64/ 15 | build/ 16 | bld/ 17 | [Bb]in/ 18 | [Oo]bj/ 19 | 20 | # Roslyn cache directories 21 | *.ide/ 22 | 23 | # MSTest test Results 24 | [Tt]est[Rr]esult*/ 25 | [Bb]uild[Ll]og.* 26 | 27 | #NUNIT 28 | *.VisualState.xml 29 | TestResult.xml 30 | 31 | # Build Results of an ATL Project 32 | [Dd]ebugPS/ 33 | [Rr]eleasePS/ 34 | dlldata.c 35 | 36 | *_i.c 37 | *_p.c 38 | *_i.h 39 | *.ilk 40 | *.meta 41 | *.obj 42 | *.pch 43 | *.pdb 44 | *.pgc 45 | *.pgd 46 | *.rsp 47 | *.sbr 48 | *.tlb 49 | *.tli 50 | *.tlh 51 | *.tmp 52 | *.tmp_proj 53 | *.log 54 | *.vspscc 55 | *.vssscc 56 | .builds 57 | *.pidb 58 | *.svclog 59 | *.scc 60 | 61 | # Chutzpah Test files 62 | _Chutzpah* 63 | 64 | # Visual C++ cache files 65 | ipch/ 66 | *.aps 67 | *.ncb 68 | *.opensdf 69 | *.sdf 70 | *.cachefile 71 | 72 | # Visual Studio profiler 73 | *.psess 74 | *.vsp 75 | *.vspx 76 | 77 | # TFS 2012 Local Workspace 78 | $tf/ 79 | 80 | # Guidance Automation Toolkit 81 | *.gpState 82 | 83 | # ReSharper is a .NET coding add-in 84 | _ReSharper*/ 85 | *.[Rr]e[Ss]harper 86 | *.DotSettings.user 87 | 88 | # JustCode is a .NET coding addin-in 89 | .JustCode 90 | 91 | # TeamCity is a build add-in 92 | _TeamCity* 93 | 94 | # DotCover is a Code Coverage Tool 95 | *.dotCover 96 | 97 | # NCrunch 98 | _NCrunch_* 99 | .*crunch*.local.xml 100 | 101 | # MightyMoose 102 | *.mm.* 103 | AutoTest.Net/ 104 | 105 | # Web workbench (sass) 106 | .sass-cache/ 107 | 108 | # Installshield output folder 109 | [Ee]xpress/ 110 | 111 | # DocProject is a documentation generator add-in 112 | DocProject/buildhelp/ 113 | DocProject/Help/*.HxT 114 | DocProject/Help/*.HxC 115 | DocProject/Help/*.hhc 116 | DocProject/Help/*.hhk 117 | DocProject/Help/*.hhp 118 | DocProject/Help/Html2 119 | DocProject/Help/html 120 | 121 | # Click-Once directory 122 | publish/ 123 | 124 | # Publish Web Output 125 | *.[Pp]ublish.xml 126 | *.azurePubxml 127 | ## TODO: Comment the next line if you want to checkin your 128 | ## web deploy settings but do note that will include unencrypted 129 | ## passwords 130 | #*.pubxml 131 | 132 | # NuGet Packages Directory 133 | packages/* 134 | ## TODO: If the tool you use requires repositories.config 135 | ## uncomment the next line 136 | #!packages/repositories.config 137 | 138 | # Enable "build/" folder in the NuGet Packages folder since 139 | # NuGet packages use it for MSBuild targets. 140 | # This line needs to be after the ignore of the build folder 141 | # (and the packages folder if the line above has been uncommented) 142 | !packages/build/ 143 | 144 | # Windows Azure Build Output 145 | csx/ 146 | *.build.csdef 147 | 148 | # Windows Store app package directory 149 | AppPackages/ 150 | 151 | # Others 152 | sql/ 153 | *.Cache 154 | ClientBin/ 155 | [Ss]tyle[Cc]op.* 156 | ~$* 157 | *~ 158 | *.dbmdl 159 | *.dbproj.schemaview 160 | *.pfx 161 | *.publishsettings 162 | node_modules/ 163 | 164 | # RIA/Silverlight projects 165 | Generated_Code/ 166 | 167 | # Backup & report files from converting an old project file 168 | # to a newer Visual Studio version. Backup files are not needed, 169 | # because we have git ;-) 170 | _UpgradeReport_Files/ 171 | Backup*/ 172 | UpgradeLog*.XML 173 | UpgradeLog*.htm 174 | 175 | # SQL Server files 176 | *.mdf 177 | *.ldf 178 | 179 | # Business Intelligence projects 180 | *.rdl.data 181 | *.bim.layout 182 | *.bim_*.settings 183 | 184 | # Microsoft Fakes 185 | FakesAssemblies/ 186 | 187 | # LightSwitch generated files 188 | GeneratedArtifacts/ 189 | _Pvt_Extensions/ 190 | ModelManifest.xml -------------------------------------------------------------------------------- /.nuget/NuGet.Config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.nuget/NuGet.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/.nuget/NuGet.exe -------------------------------------------------------------------------------- /.nuget/NuGet.targets: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(MSBuildProjectDirectory)\..\ 5 | 6 | 7 | false 8 | 9 | 10 | false 11 | 12 | 13 | true 14 | 15 | 16 | false 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) 31 | 32 | 33 | 34 | 35 | $(SolutionDir).nuget 36 | 37 | 38 | 39 | $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config 40 | $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config 41 | 42 | 43 | 44 | $(MSBuildProjectDirectory)\packages.config 45 | $(PackagesProjectConfig) 46 | 47 | 48 | 49 | 50 | $(NuGetToolsPath)\NuGet.exe 51 | @(PackageSource) 52 | 53 | "$(NuGetExePath)" 54 | mono --runtime=v4.0.30319 "$(NuGetExePath)" 55 | 56 | $(TargetDir.Trim('\\')) 57 | 58 | -RequireConsent 59 | -NonInteractive 60 | 61 | "$(SolutionDir) " 62 | "$(SolutionDir)" 63 | 64 | 65 | $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir) 66 | $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols 67 | 68 | 69 | 70 | RestorePackages; 71 | $(BuildDependsOn); 72 | 73 | 74 | 75 | 76 | $(BuildDependsOn); 77 | BuildPackage; 78 | 79 | 80 | 81 | 82 | 83 | 84 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 99 | 100 | 103 | 104 | 105 | 106 | 108 | 109 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 141 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /FormsPopup.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25420.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup", "FormsPopup\FormsPopup\FormsPopup.csproj", "{CA22517D-4B83-43F5-A23F-9207229D2024}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup.iOS", "FormsPopup\FormsPopup.iOS\FormsPopup.iOS.csproj", "{ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup.Droid", "FormsPopup\FormsPopup.Droid\FormsPopup.Droid.csproj", "{34D6EE8D-1671-4A69-9736-A3BD774037B9}" 11 | EndProject 12 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{632435A2-E61B-4422-A2F2-7145CA6A074D}" 13 | ProjectSection(SolutionItems) = preProject 14 | .nuget\NuGet.Config = .nuget\NuGet.Config 15 | .nuget\NuGet.exe = .nuget\NuGet.exe 16 | .nuget\NuGet.targets = .nuget\NuGet.targets 17 | EndProjectSection 18 | EndProject 19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsPopup.Examples", "FormsPopup\FormsPopup.Examples\FormsPopup.Examples.csproj", "{67F9D3A8-F71E-4428-913F-C37AE82CDB24}" 20 | EndProject 21 | Global 22 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 23 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU 24 | Ad-Hoc|iPhone = Ad-Hoc|iPhone 25 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator 26 | Ad-Hoc|Mixed Platforms = Ad-Hoc|Mixed Platforms 27 | AppStore|Any CPU = AppStore|Any CPU 28 | AppStore|iPhone = AppStore|iPhone 29 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator 30 | AppStore|Mixed Platforms = AppStore|Mixed Platforms 31 | Debug|Any CPU = Debug|Any CPU 32 | Debug|iPhone = Debug|iPhone 33 | Debug|iPhoneSimulator = Debug|iPhoneSimulator 34 | Debug|Mixed Platforms = Debug|Mixed Platforms 35 | Release|Any CPU = Release|Any CPU 36 | Release|iPhone = Release|iPhone 37 | Release|iPhoneSimulator = Release|iPhoneSimulator 38 | Release|Mixed Platforms = Release|Mixed Platforms 39 | EndGlobalSection 40 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 41 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 42 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 43 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 44 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 45 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU 46 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU 47 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 48 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Any CPU.Build.0 = Release|Any CPU 49 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|iPhone.ActiveCfg = Release|Any CPU 50 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 51 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU 52 | {CA22517D-4B83-43F5-A23F-9207229D2024}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU 53 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 54 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Any CPU.Build.0 = Debug|Any CPU 55 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|iPhone.ActiveCfg = Debug|Any CPU 56 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 57 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 58 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 59 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Any CPU.ActiveCfg = Release|Any CPU 60 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Any CPU.Build.0 = Release|Any CPU 61 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|iPhone.ActiveCfg = Release|Any CPU 62 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 63 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 64 | {CA22517D-4B83-43F5-A23F-9207229D2024}.Release|Mixed Platforms.Build.0 = Release|Any CPU 65 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone 66 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone 67 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone 68 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator 69 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator 70 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|Mixed Platforms.ActiveCfg = Ad-Hoc|iPhone 71 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Ad-Hoc|Mixed Platforms.Build.0 = Ad-Hoc|iPhone 72 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone 73 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhone.ActiveCfg = AppStore|iPhone 74 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhone.Build.0 = AppStore|iPhone 75 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator 76 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator 77 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|Mixed Platforms.ActiveCfg = AppStore|iPhone 78 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.AppStore|Mixed Platforms.Build.0 = AppStore|iPhone 79 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator 80 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhone.ActiveCfg = Debug|iPhone 81 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhone.Build.0 = Debug|iPhone 82 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator 83 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator 84 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Mixed Platforms.ActiveCfg = Debug|iPhone 85 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Mixed Platforms.Build.0 = Debug|iPhone 86 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|Any CPU.ActiveCfg = Release|iPhone 87 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhone.ActiveCfg = Release|iPhone 88 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhone.Build.0 = Release|iPhone 89 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator 90 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator 91 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|Mixed Platforms.ActiveCfg = Release|iPhone 92 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Release|Mixed Platforms.Build.0 = Release|iPhone 93 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator 94 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 95 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 96 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU 97 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 98 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 99 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU 100 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU 101 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Ad-Hoc|Mixed Platforms.Deploy.0 = Release|Any CPU 102 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 103 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Any CPU.Build.0 = Release|Any CPU 104 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Any CPU.Deploy.0 = Release|Any CPU 105 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|iPhone.ActiveCfg = Release|Any CPU 106 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 107 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU 108 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU 109 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.AppStore|Mixed Platforms.Deploy.0 = Release|Any CPU 110 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 111 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Any CPU.Build.0 = Debug|Any CPU 112 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 113 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|iPhone.ActiveCfg = Debug|Any CPU 114 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 115 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 116 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 117 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU 118 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Any CPU.ActiveCfg = Release|Any CPU 119 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Any CPU.Build.0 = Release|Any CPU 120 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Any CPU.Deploy.0 = Release|Any CPU 121 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|iPhone.ActiveCfg = Release|Any CPU 122 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 123 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 124 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Mixed Platforms.Build.0 = Release|Any CPU 125 | {34D6EE8D-1671-4A69-9736-A3BD774037B9}.Release|Mixed Platforms.Deploy.0 = Release|Any CPU 126 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 127 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 128 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 129 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 130 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Mixed Platforms.ActiveCfg = Release|Any CPU 131 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Ad-Hoc|Mixed Platforms.Build.0 = Release|Any CPU 132 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 133 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Any CPU.Build.0 = Release|Any CPU 134 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|iPhone.ActiveCfg = Release|Any CPU 135 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 136 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU 137 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU 138 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 139 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Any CPU.Build.0 = Debug|Any CPU 140 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|iPhone.ActiveCfg = Debug|Any CPU 141 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 142 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU 143 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU 144 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Any CPU.ActiveCfg = Release|Any CPU 145 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Any CPU.Build.0 = Release|Any CPU 146 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|iPhone.ActiveCfg = Release|Any CPU 147 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 148 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU 149 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24}.Release|Mixed Platforms.Build.0 = Release|Any CPU 150 | EndGlobalSection 151 | GlobalSection(SolutionProperties) = preSolution 152 | HideSolutionNode = FALSE 153 | EndGlobalSection 154 | EndGlobal 155 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/FormsPopup.Droid.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | {34D6EE8D-1671-4A69-9736-A3BD774037B9} 7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 8 | Library 9 | Properties 10 | FormsPopup.Droid 11 | FormsPopup.Droid 12 | 512 13 | true 14 | Resources\Resource.Designer.cs 15 | Off 16 | Properties\AndroidManifest.xml 17 | True 18 | armeabi,armeabi-v7a,x86 19 | 20 | 21 | 22 | 23 | 24 | v6.0 25 | 26 | 27 | ..\..\ 28 | true 29 | 30 | 31 | true 32 | full 33 | false 34 | bin\Debug\ 35 | DEBUG;TRACE 36 | prompt 37 | 4 38 | None 39 | 40 | 41 | pdbonly 42 | true 43 | bin\Release\ 44 | TRACE 45 | prompt 46 | 4 47 | False 48 | 49 | 50 | 51 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\FormsViewGroup.dll 52 | True 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll 62 | True 63 | 64 | 65 | ..\..\packages\Xamarin.Android.Support.Design.23.3.0\lib\MonoAndroid43\Xamarin.Android.Support.Design.dll 66 | True 67 | 68 | 69 | ..\..\packages\Xamarin.Android.Support.v4.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll 70 | True 71 | 72 | 73 | ..\..\packages\Xamarin.Android.Support.v7.AppCompat.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.AppCompat.dll 74 | True 75 | 76 | 77 | ..\..\packages\Xamarin.Android.Support.v7.CardView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.CardView.dll 78 | True 79 | 80 | 81 | ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.MediaRouter.dll 82 | True 83 | 84 | 85 | ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.v7.RecyclerView.dll 86 | True 87 | 88 | 89 | ..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll 90 | True 91 | 92 | 93 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Core.dll 94 | True 95 | 96 | 97 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Platform.dll 98 | True 99 | 100 | 101 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll 102 | True 103 | 104 | 105 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll 106 | True 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24} 131 | FormsPopup.Examples 132 | 133 | 134 | 135 | 136 | 137 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 153 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/FormsPopup.Droid.csproj.bak: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | {34D6EE8D-1671-4A69-9736-A3BD774037B9} 7 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 8 | Library 9 | Properties 10 | FormsPopup.Droid 11 | FormsPopup.Droid 12 | 512 13 | true 14 | Resources\Resource.Designer.cs 15 | Off 16 | Properties\AndroidManifest.xml 17 | True 18 | armeabi,armeabi-v7a,x86 19 | 20 | 21 | 22 | 23 | 24 | v5.0 25 | 9a68efc6 26 | ..\..\ 27 | true 28 | 29 | 30 | true 31 | full 32 | false 33 | bin\Debug\ 34 | DEBUG;TRACE 35 | prompt 36 | 4 37 | None 38 | 39 | 40 | pdbonly 41 | true 42 | bin\Release\ 43 | TRACE 44 | prompt 45 | 4 46 | False 47 | 48 | 49 | 50 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\FormsViewGroup.dll 51 | True 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | ..\..\packages\Xamarin.Android.Support.v4.22.2.0.0\lib\MonoAndroid403\Xamarin.Android.Support.v4.dll 61 | True 62 | 63 | 64 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Core.dll 65 | True 66 | 67 | 68 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Platform.dll 69 | True 70 | 71 | 72 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll 73 | True 74 | 75 | 76 | ..\..\packages\Xamarin.Forms.1.4.3.6376\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll 77 | True 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24} 102 | FormsPopup.Examples 103 | 104 | 105 | 106 | 107 | 108 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 109 | 110 | 111 | 112 | 113 | 120 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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 | using FormsPopup.Examples; 10 | 11 | namespace FormsPopup.Droid 12 | { 13 | [Activity(Label = "FormsPopup", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 14 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 15 | { 16 | protected override void OnCreate(Bundle bundle) 17 | { 18 | base.OnCreate(bundle); 19 | 20 | global::Xamarin.Forms.Forms.Init(this, bundle); 21 | LoadApplication(new App()); 22 | } 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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("FormsPopup.Droid")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("FormsPopup.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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/Resources/Resource.Designer.cs: -------------------------------------------------------------------------------- 1 | #pragma warning disable 1591 2 | // ------------------------------------------------------------------------------ 3 | // 4 | // This code was generated by a tool. 5 | // Mono Runtime Version: 4.0.30319.42000 6 | // 7 | // Changes to this file may cause incorrect behavior and will be lost if 8 | // the code is regenerated. 9 | // 10 | // ------------------------------------------------------------------------------ 11 | 12 | [assembly: Android.Runtime.ResourceDesignerAttribute("FormsPopup.Droid.Resource", IsApplication=true)] 13 | 14 | namespace FormsPopup.Droid 15 | { 16 | 17 | 18 | [System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] 19 | public partial class Resource 20 | { 21 | 22 | static Resource() 23 | { 24 | global::Android.Runtime.ResourceIdManager.UpdateIdValues(); 25 | } 26 | 27 | public static void UpdateIdValues() 28 | { 29 | global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::FormsPopup.Droid.Resource.Attribute.actionBarSize; 30 | } 31 | 32 | public partial class Attribute 33 | { 34 | 35 | static Attribute() 36 | { 37 | global::Android.Runtime.ResourceIdManager.UpdateIdValues(); 38 | } 39 | 40 | private Attribute() 41 | { 42 | } 43 | } 44 | 45 | public partial class Drawable 46 | { 47 | 48 | // aapt resource value: 0x7f020000 49 | public const int icon = 2130837504; 50 | 51 | static Drawable() 52 | { 53 | global::Android.Runtime.ResourceIdManager.UpdateIdValues(); 54 | } 55 | 56 | private Drawable() 57 | { 58 | } 59 | } 60 | } 61 | } 62 | #pragma warning restore 1591 63 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/Resources/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/Resources/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/Resources/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/Resources/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.Droid/Resources/drawable/icon.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Droid/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Examples/App.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms; 2 | 3 | namespace FormsPopup.Examples 4 | { 5 | public class App : Application 6 | { 7 | public App() 8 | { 9 | /* 10 | * Try these: 11 | * MainPage = new CodedPopupExample(); 12 | * MainPage = new CodedSimpleExample(); 13 | * MainPage = new NavigationPage(new NavigationExample()); 14 | * MainPage = new CodedPopupExample(); 15 | * MainPage = new ComplexLayoutExample(); 16 | */ 17 | 18 | MainPage = new CodedPopupExample(); 19 | } 20 | 21 | protected override void OnStart() 22 | { 23 | // Handle when your app starts 24 | } 25 | 26 | protected override void OnSleep() 27 | { 28 | // Handle when your app sleeps 29 | } 30 | 31 | protected override void OnResume() 32 | { 33 | // Handle when your app resumes 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Examples/CodedPopupExample.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xamarin.Forms; 4 | 5 | namespace FormsPopup.Examples 6 | { 7 | public class CodedPopupExample : ContentPage 8 | { 9 | private readonly SwitchCell _closeOnAnyTap; 10 | private readonly SwitchCell _preventShowing; 11 | private readonly SwitchCell _displayTappedSection; 12 | private readonly SwitchCell _showingAnimation; 13 | private readonly Popup _popup1; 14 | 15 | 16 | public CodedPopupExample() 17 | { 18 | _closeOnAnyTap = new SwitchCell {Text = "Close on any tap", On = true}; 19 | _preventShowing = new SwitchCell { Text = "Prevent popup from showing" }; 20 | _displayTappedSection = new SwitchCell {Text = "Display the tapped section's name"}; 21 | _showingAnimation = new SwitchCell { Text = "Turn on 'Showing' animation" }; 22 | 23 | var showPopup = new Button {Text = "Show Popup"}; 24 | 25 | var closeButton = new Button 26 | { 27 | Text = "Close", 28 | TextColor = Color.FromHex("#D37E00"), 29 | BackgroundColor = Color.White, 30 | }; 31 | 32 | _popup1 = new Popup 33 | { 34 | XPositionRequest = 0.5, 35 | YPositionRequest = 0.5, 36 | ContentWidthRequest = 0.8, 37 | ContentHeightRequest = 0.5, 38 | 39 | Header = new ContentView 40 | { 41 | Padding = 10, 42 | BackgroundColor = Color.FromHex("#3399FF"), 43 | Content = new Label 44 | { 45 | FontSize = Device.GetNamedSize(NamedSize.Large, typeof (Label)), 46 | TextColor = Color.White, 47 | Text = "Simple popup" 48 | } 49 | }, 50 | 51 | Body = new ContentView 52 | { 53 | Padding = 10, 54 | BackgroundColor = Color.White, 55 | Content = new Label 56 | { 57 | FontSize = Device.GetNamedSize(NamedSize.Medium, typeof (Label)), 58 | TextColor = Color.Gray, 59 | Text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 60 | } 61 | }, 62 | 63 | Footer = new ContentView 64 | { 65 | BackgroundColor = Color.White, 66 | 67 | Content = new StackLayout 68 | { 69 | Orientation = StackOrientation.Horizontal, 70 | HorizontalOptions = LayoutOptions.EndAndExpand, 71 | Children = { closeButton } 72 | } 73 | } 74 | }; 75 | 76 | 77 | Content = new StackLayout 78 | { 79 | Children = 80 | { 81 | new TableView 82 | { 83 | Intent = TableIntent.Settings, 84 | Root = new TableRoot 85 | { 86 | new TableSection("Coded Popup Example") 87 | { 88 | _closeOnAnyTap, 89 | _preventShowing, 90 | _displayTappedSection, 91 | _showingAnimation 92 | } 93 | }, 94 | }, 95 | 96 | showPopup 97 | } 98 | }; 99 | 100 | // Required to be instantiated before the popup is added to ContentPage.Content 101 | new PopupPageInitializer(this) { _popup1 }; 102 | 103 | 104 | _popup1.Tapped += Popup1_Tapped; 105 | _popup1.Showing += Popup1_Showing; 106 | showPopup.Clicked += ShowPopup_Clicked; 107 | closeButton.Clicked += CloseButton_Clicked; 108 | } 109 | 110 | 111 | private async void CloseButton_Clicked(object sender, EventArgs e) 112 | { 113 | await _popup1.HideAsync(async p => 114 | { 115 | await p.FadeTo(0, 250, Easing.Linear); 116 | p.Opacity = 1; 117 | }); 118 | } 119 | 120 | 121 | private void Popup1_Showing(object sender, PopupShowingEventArgs e) 122 | { 123 | if (_preventShowing.On) 124 | { 125 | e.Cancel = true; 126 | } 127 | } 128 | 129 | 130 | private void Popup1_Tapped(object sender, PopupTappedEventArgs e) 131 | { 132 | if (_closeOnAnyTap.On) 133 | { 134 | e.Popup.Hide(); 135 | } 136 | 137 | if (_displayTappedSection.On) 138 | { 139 | DisplayAlert("Information", $"{e.Section} tapped.", "OK"); 140 | } 141 | } 142 | 143 | 144 | private async void ShowPopup_Clicked(object sender, EventArgs e) 145 | { 146 | if (_showingAnimation.On) 147 | { 148 | double original; 149 | 150 | await _popup1.ShowAsync(async p => 151 | { 152 | original = p.Scale; 153 | 154 | await Task.WhenAll 155 | ( 156 | p.SectionContainer.RelScaleTo(0.05, 100, Easing.CubicOut), 157 | p.SectionContainer.RelScaleTo(-0.05, 105, Easing.CubicOut) 158 | ).ContinueWith(c => 159 | { 160 | Device.BeginInvokeOnMainThread(() => 161 | { 162 | p.SectionContainer.Scale = original; 163 | }); 164 | }); 165 | }); 166 | } 167 | else 168 | { 169 | _popup1.Show(); 170 | } 171 | } 172 | } 173 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Examples/CodedSimpleExample.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms; 2 | 3 | namespace FormsPopup.Examples 4 | { 5 | public class CodedSimpleExample : ContentPage 6 | { 7 | public CodedSimpleExample() 8 | { 9 | var popup = new Popup 10 | { 11 | XPositionRequest = 0.5, 12 | YPositionRequest = 0.5, 13 | ContentHeightRequest = 0.8, 14 | ContentWidthRequest = 0.8, 15 | Padding = 10, 16 | Body = new ContentView 17 | { 18 | BackgroundColor = Color.White, 19 | Content = new StackLayout 20 | { 21 | Children = 22 | { 23 | new Entry(), 24 | new Label 25 | { 26 | VerticalTextAlignment = TextAlignment.Center, 27 | HorizontalTextAlignment = TextAlignment.Center, 28 | TextColor = Color.Black, 29 | Text = "Hello, World!" 30 | } 31 | } 32 | } 33 | } 34 | }; 35 | 36 | popup.Tapped += (sender, args) => 37 | { 38 | args.Popup.Hide(); 39 | }; 40 | 41 | 42 | var button = new Button { Text = "Show Popup" }; 43 | button.Clicked += (s, e) => popup.Show(); 44 | 45 | var stack = new StackLayout 46 | { 47 | Children = 48 | { 49 | new Entry { Text = "Some input..."}, 50 | button 51 | } 52 | }; 53 | 54 | Device.OnPlatform(() => stack.Padding = new Thickness(0, 25, 0, 0)); 55 | Content = stack; 56 | new PopupPageInitializer(this) { popup }; 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Examples/ComplexLayoutExample.xaml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 20 | 21 | 22 | 23 | 30 | 31 | 32 | 33 | 35 | 36 | 37 | 38 | 39 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Examples/XamlPopupExample.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xamarin.Forms; 4 | 5 | namespace FormsPopup.Examples 6 | { 7 | public partial class XamlPopupExample 8 | { 9 | public XamlPopupExample() 10 | { 11 | InitializeComponent(); 12 | } 13 | 14 | 15 | private void Popup1_Showing(object sender, PopupShowingEventArgs e) 16 | { 17 | if (preventShowing.On) 18 | { 19 | e.Cancel = true; 20 | } 21 | } 22 | 23 | 24 | private void Popup1_Tapped(object sender, PopupTappedEventArgs e) 25 | { 26 | if (closeOnAnyTap.On) 27 | { 28 | e.Popup.Hide(); 29 | } 30 | 31 | if (displayTappedSection.On) 32 | { 33 | DisplayAlert("Information", string.Format("{0} tapped.", e.Section), "OK"); 34 | } 35 | } 36 | 37 | 38 | private async void Button_OnClicked(object sender, EventArgs e) 39 | { 40 | if (showingAnimation.On) 41 | { 42 | double original; 43 | 44 | await popup1.ShowAsync(async p => 45 | { 46 | original = p.Scale; 47 | 48 | await Task.WhenAll 49 | ( 50 | p.SectionContainer.RelScaleTo(0.05, 100, Easing.CubicOut), 51 | p.SectionContainer.RelScaleTo(-0.05, 105, Easing.CubicOut) 52 | ) 53 | .ContinueWith(r => p.SectionContainer.Scale = original); 54 | }); 55 | } 56 | else 57 | { 58 | popup1.Show(); 59 | } 60 | } 61 | 62 | private async void CloseButton_OnClicked(object sender, EventArgs e) 63 | { 64 | await popup1.HideAsync(async p => 65 | { 66 | await p.FadeTo(0, 250, Easing.Linear); 67 | p.Opacity = 1; 68 | }); 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.Examples/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using FormsPopup.Examples; 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace FormsPopup.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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/FormsPopup.iOS.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | iPhoneSimulator 6 | {ACAD5952-BF6D-4F5A-9ABE-E902865B9A90} 7 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 8 | Exe 9 | FormsPopup.iOS 10 | Resources 11 | FormsPopupiOS 12 | 13 | 14 | ..\..\ 15 | true 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 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll 124 | True 125 | 126 | 127 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll 128 | True 129 | 130 | 131 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll 132 | True 133 | 134 | 135 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll 136 | True 137 | 138 | 139 | 140 | 141 | 142 | {67F9D3A8-F71E-4428-913F-C37AE82CDB24} 143 | FormsPopup.Examples 144 | 145 | 146 | 147 | 148 | 149 | This project references NuGet package(s) that are missing on this computer. Enable 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 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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 | FormsPopup 27 | CFBundleIdentifier 28 | com.yourcompany.FormsPopup 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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace FormsPopup.iOS 9 | { 10 | public class Application 11 | { 12 | // This is the main entry point of the application. 13 | static void Main(string[] args) 14 | { 15 | // if you want to use a different Application Delegate class from "AppDelegate" 16 | // you can specify it here. 17 | UIApplication.Main(args, null, "AppDelegate"); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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("FormsPopup.iOS")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("FormsPopup.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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-60@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-60@3x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-76.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-76@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small@2x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/Resources/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/Resources/Icon-Small@3x.png -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/iTunesArtwork -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/FormsPopup/FormsPopup.iOS/iTunesArtwork@2x -------------------------------------------------------------------------------- /FormsPopup/FormsPopup.iOS/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/FormsPopup.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 10.0 6 | Debug 7 | AnyCPU 8 | {CA22517D-4B83-43F5-A23F-9207229D2024} 9 | Library 10 | Properties 11 | FormsPopup 12 | FormsPopup 13 | v4.5 14 | Profile78 15 | 512 16 | {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 17 | 18 | 19 | ..\..\ 20 | true 21 | 22 | 23 | true 24 | full 25 | false 26 | bin\Debug\ 27 | DEBUG;TRACE 28 | prompt 29 | 4 30 | 31 | 32 | pdbonly 33 | true 34 | bin\Release\ 35 | TRACE 36 | prompt 37 | 4 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Core.dll 54 | True 55 | 56 | 57 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Platform.dll 58 | True 59 | 60 | 61 | ..\..\packages\Xamarin.Forms.2.3.0.107\lib\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.Xaml.dll 62 | True 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 72 | 73 | 74 | 75 | 76 | 77 | 78 | 85 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/Popup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xamarin.Forms; 4 | 5 | namespace FormsPopup 6 | { 7 | /// 8 | /// Popup view to be displayed over a . 9 | /// 10 | /// 11 | /// No default styles have been created for this view. 12 | /// 13 | public class Popup : ContentView 14 | { 15 | private readonly AbsoluteLayout _popupView = new AbsoluteLayout(); 16 | private readonly RelativeLayout _sectionContainer = new RelativeLayout(); 17 | 18 | private readonly ContentView _headerSection = new ContentView(); 19 | private readonly ContentView _bodySection = new ContentView(); 20 | private readonly ContentView _footerSection = new ContentView(); 21 | 22 | private readonly BoxView _leftBorder = new BoxView(); 23 | private readonly BoxView _rightBorder = new BoxView(); 24 | private readonly BoxView _topBorder = new BoxView(); 25 | private readonly BoxView _bottomBorder = new BoxView(); 26 | 27 | private const double BorderWidth = 1; 28 | 29 | 30 | /// 31 | /// The SecionContainer includes the , , and 32 | /// 33 | public VisualElement SectionContainer => _sectionContainer; 34 | 35 | 36 | #region Events 37 | 38 | 39 | public event EventHandler Tapped; 40 | public event EventHandler Initializing; 41 | public event EventHandler Showing; 42 | public event EventHandler Shown; 43 | 44 | public event EventHandler Hiding; 45 | public event EventHandler Hidden; 46 | 47 | 48 | protected virtual void OnPropertyTapped(PopupTappedEventArgs e) 49 | { 50 | Tapped?.Invoke(this, e); 51 | } 52 | 53 | 54 | protected internal virtual void OnInitializing() 55 | { 56 | Initializing?.Invoke(this, EventArgs.Empty); 57 | } 58 | 59 | 60 | protected virtual PopupShowingEventArgs OnShowing() 61 | { 62 | var args = new PopupShowingEventArgs(); 63 | Showing?.Invoke(this, args); 64 | return args; 65 | } 66 | 67 | 68 | protected virtual void OnShown() 69 | { 70 | Shown?.Invoke(this, EventArgs.Empty); 71 | } 72 | 73 | 74 | protected virtual PopupHidingEventArgs OnHiding() 75 | { 76 | var args = new PopupHidingEventArgs(); 77 | Hiding?.Invoke(this, args); 78 | return args; 79 | } 80 | 81 | 82 | protected virtual void OnHidden() 83 | { 84 | Hidden?.Invoke(this, EventArgs.Empty); 85 | } 86 | 87 | 88 | #endregion 89 | 90 | 91 | #region Dependency Properties 92 | 93 | 94 | public static readonly BindableProperty HeaderProperty = BindableProperty.Create(nameof(Header), typeof(View), typeof(Popup), null, propertyChanged: OnHeaderPropertyChanged); 95 | public static readonly BindableProperty BodyProperty = BindableProperty.Create(nameof(Body), typeof (View), typeof (Popup), null, propertyChanged: OnBodyPropertyChanged); 96 | public static readonly BindableProperty FooterProperty = BindableProperty.Create(nameof(Footer), typeof (View), typeof (Popup), null, propertyChanged: OnFooterPropertyChanged); 97 | 98 | public static readonly BindableProperty XPositionRequestProperty = BindableProperty.Create(nameof(XPositionRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged); 99 | public static readonly BindableProperty YPositionRequestProperty = BindableProperty.Create(nameof(XPositionRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged); 100 | 101 | public static readonly BindableProperty LeftBorderColorProperty = BindableProperty.Create(nameof(LeftBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnLeftBorderChanged); 102 | public static readonly BindableProperty RightBorderColorProperty = BindableProperty.Create(nameof(RightBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnRightBorderChanged); 103 | public static readonly BindableProperty TopBorderColorProperty = BindableProperty.Create(nameof(TopBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnTopBorderChanged); 104 | public static readonly BindableProperty BottomBorderColorProperty = BindableProperty.Create(nameof(BottomBorderColor), typeof (Color), typeof (Popup), Color.Transparent, propertyChanged: OnBottomBorderChanged); 105 | 106 | 107 | public static readonly BindableProperty ContentWidthRequestProperty = BindableProperty.Create(nameof(ContentWidthRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged); 108 | public static readonly BindableProperty ContentHeightRequestProperty = BindableProperty.Create(nameof(ContentHeightRequest), typeof (double), typeof (Popup), default(double), propertyChanged: OnPositionChanged); 109 | 110 | internal static readonly BindableProperty SectionTypeProperty = BindableProperty.CreateAttached("SectionType", typeof (PopupSectionType), typeof (Popup), PopupSectionType.NotSet); 111 | 112 | 113 | public View Header 114 | { 115 | get { return (View)GetValue(HeaderProperty); } 116 | set 117 | { 118 | SetValue(HeaderProperty, value); 119 | _headerSection.Content = value; 120 | } 121 | } 122 | 123 | public View Body 124 | { 125 | get { return (View)GetValue(BodyProperty); } 126 | set 127 | { 128 | SetValue(BodyProperty, value); 129 | _bodySection.Content = value; 130 | } 131 | } 132 | 133 | 134 | public View Footer 135 | { 136 | get { return (View)GetValue(FooterProperty); } 137 | set 138 | { 139 | SetValue(FooterProperty, value); 140 | _footerSection.Content = value; 141 | } 142 | } 143 | 144 | 145 | public double XPositionRequest 146 | { 147 | get { return (double)GetValue(XPositionRequestProperty); } 148 | set { SetValue(XPositionRequestProperty, value); } 149 | } 150 | 151 | 152 | public double YPositionRequest 153 | { 154 | get { return (double)GetValue(YPositionRequestProperty); } 155 | set { SetValue(YPositionRequestProperty, value); } 156 | } 157 | 158 | 159 | public Color LeftBorderColor 160 | { 161 | get { return (Color)GetValue(LeftBorderColorProperty); } 162 | set { SetValue(LeftBorderColorProperty, value); } 163 | } 164 | 165 | 166 | public Color RightBorderColor 167 | { 168 | get { return (Color)GetValue(RightBorderColorProperty); } 169 | set { SetValue(RightBorderColorProperty, value); } 170 | } 171 | 172 | 173 | public Color TopBorderColor 174 | { 175 | get { return (Color)GetValue(TopBorderColorProperty); } 176 | set { SetValue(TopBorderColorProperty, value); } 177 | } 178 | 179 | 180 | public Color BottomBorderColor 181 | { 182 | get { return (Color)GetValue(BottomBorderColorProperty); } 183 | set { SetValue(BottomBorderColorProperty, value); } 184 | } 185 | 186 | 187 | public double ContentWidthRequest 188 | { 189 | get { return (double)GetValue(ContentWidthRequestProperty); } 190 | set { SetValue(ContentWidthRequestProperty, value); } 191 | } 192 | 193 | 194 | public double ContentHeightRequest 195 | { 196 | get { return (double)GetValue(ContentHeightRequestProperty); } 197 | set { SetValue(ContentHeightRequestProperty, value); } 198 | } 199 | 200 | 201 | #endregion 202 | 203 | 204 | #region Dependency Properties Changing 205 | 206 | 207 | private static void OnHeaderPropertyChanged(BindableObject bindable, object oldValue, object newValue) 208 | { 209 | var popup = (Popup)bindable; 210 | popup.Header = (View)newValue; 211 | } 212 | 213 | 214 | private static void OnBodyPropertyChanged(BindableObject bindable, object oldValue, object newValue) 215 | { 216 | var popup = (Popup)bindable; 217 | popup.Body = (View)newValue; 218 | } 219 | 220 | 221 | private static void OnFooterPropertyChanged(BindableObject bindable, object oldValue, object newValue) 222 | { 223 | var popup = (Popup)bindable; 224 | popup.Footer = (View)newValue; 225 | } 226 | 227 | 228 | private static void OnPositionChanged(BindableObject bindable, object oldvalue, object newvalue) 229 | { 230 | var view = (VisualElement)bindable; 231 | var popup = view.FindParent(); 232 | 233 | var rect = new Rectangle(popup.XPositionRequest, popup.YPositionRequest, popup.ContentWidthRequest, popup.ContentHeightRequest); 234 | view.Layout(rect); 235 | AbsoluteLayout.SetLayoutBounds(view, rect); 236 | } 237 | 238 | 239 | private static void OnLeftBorderChanged(BindableObject bindable, object oldvalue, object newvalue) 240 | { 241 | var popup = (Popup)bindable; 242 | if (popup == null) return; 243 | 244 | popup._leftBorder.BackgroundColor = (Color) newvalue; 245 | } 246 | 247 | 248 | private static void OnRightBorderChanged(BindableObject bindable, object oldvalue, object newvalue) 249 | { 250 | var popup = (Popup)bindable; 251 | if (popup == null) return; 252 | 253 | popup._rightBorder.BackgroundColor = (Color) newvalue; 254 | } 255 | 256 | 257 | private static void OnTopBorderChanged(BindableObject bindable, object oldvalue, object newvalue) 258 | { 259 | var popup = (Popup)bindable; 260 | if (popup == null) return; 261 | 262 | popup._topBorder.BackgroundColor = (Color) newvalue; 263 | } 264 | 265 | 266 | private static void OnBottomBorderChanged(BindableObject bindable, object oldvalue, object newvalue) 267 | { 268 | var popup = (Popup)bindable; 269 | if (popup == null) return; 270 | 271 | popup._bottomBorder.BackgroundColor = (Color) newvalue; 272 | } 273 | 274 | 275 | #endregion 276 | 277 | 278 | public Popup() 279 | { 280 | IsVisible = false; 281 | _sectionContainer.BindingContext = this; 282 | _sectionContainer.Padding = 0; 283 | _popupView.Padding = 0; 284 | _bodySection.VerticalOptions = LayoutOptions.FillAndExpand; 285 | 286 | 287 | // Used to identify if the user tapped within the header, body, or footer. 288 | _headerSection.SetValue(SectionTypeProperty, PopupSectionType.Header); 289 | _bodySection.SetValue(SectionTypeProperty, PopupSectionType.Body); 290 | _footerSection.SetValue(SectionTypeProperty, PopupSectionType.Footer); 291 | _popupView.SetValue(SectionTypeProperty, PopupSectionType.Backdrop); 292 | 293 | 294 | // Used to assign border colors 295 | _leftBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.LeftBorderColor)); 296 | _rightBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.RightBorderColor)); 297 | _bottomBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.BottomBorderColor)); 298 | _topBorder.SetBinding(BackgroundColorProperty, Binding.Create((Popup p) => p.TopBorderColor)); 299 | 300 | 301 | // Adjust the layout bounds (not the overlay) 302 | _sectionContainer.SetBinding(ContentWidthRequestProperty, Binding.Create((Popup p) => p.ContentWidthRequest)); 303 | _sectionContainer.SetBinding(ContentHeightRequestProperty, Binding.Create((Popup p) => p.ContentHeightRequest)); 304 | _sectionContainer.SetBinding(XPositionRequestProperty, Binding.Create((Popup p) => p.XPositionRequest)); 305 | _sectionContainer.SetBinding(YPositionRequestProperty, Binding.Create((Popup p) => p.YPositionRequest)); 306 | 307 | 308 | // sizing section container. The overlay is not sized in this class. 309 | AbsoluteLayout.SetLayoutFlags(_sectionContainer, AbsoluteLayoutFlags.All); 310 | AbsoluteLayout.SetLayoutBounds(_sectionContainer, new Rectangle(0, 0, 1, 1)); 311 | 312 | Initializing += OnPopupInitializing; 313 | 314 | 315 | // Create the content 316 | var content = new StackLayout 317 | { 318 | Padding = 0, 319 | Spacing = 0, 320 | Orientation = StackOrientation.Vertical, 321 | 322 | Children = 323 | { 324 | _headerSection, 325 | _bodySection, 326 | _footerSection 327 | } 328 | }; 329 | 330 | _popupView.Children.Add(_sectionContainer); 331 | 332 | 333 | // Position content 334 | _sectionContainer.Children.Add(content, 335 | Constraint.Constant(XPositionRequest), 336 | Constraint.Constant(YPositionRequest), 337 | Constraint.RelativeToParent(p => p.Width), 338 | Constraint.RelativeToParent(p => p.Height)); 339 | 340 | // Position left border 341 | _sectionContainer.Children.Add(_leftBorder, 342 | Constraint.Constant(0), 343 | Constraint.Constant(0), 344 | Constraint.Constant(BorderWidth), 345 | Constraint.RelativeToParent(p => p.Height)); 346 | 347 | // Position right border 348 | _sectionContainer.Children.Add(_rightBorder, 349 | Constraint.RelativeToParent(p => p.Width), 350 | Constraint.Constant(0), 351 | Constraint.Constant(BorderWidth), 352 | Constraint.RelativeToParent(p => p.Height)); 353 | 354 | // Position top border 355 | _sectionContainer.Children.Add(_topBorder, 356 | Constraint.Constant(0), 357 | Constraint.Constant(0), 358 | Constraint.RelativeToParent(p => p.Width), 359 | Constraint.Constant(BorderWidth)); 360 | 361 | // Position bottom border 362 | _sectionContainer.Children.Add(_bottomBorder, 363 | Constraint.Constant(0), 364 | Constraint.RelativeToParent(p => p.Height), 365 | Constraint.RelativeToParent(p => p.Width), 366 | Constraint.Constant(BorderWidth)); 367 | 368 | Content = _popupView; 369 | } 370 | 371 | 372 | /// 373 | /// Show the popup view. 374 | /// 375 | /// The method is passed the VisualElement that contains the body, header, and footer 376 | /// 377 | /// This method is not limited adding animations. 378 | /// 379 | public async Task ShowAsync(Func animation) 380 | { 381 | if (IsVisible) 382 | { 383 | return; 384 | } 385 | 386 | var parent = Parent.FindParent(); 387 | parent?.RaiseChild(_popupView); 388 | 389 | var handlerResponse = OnShowing(); 390 | if (handlerResponse.Cancel) 391 | { 392 | return; 393 | } 394 | 395 | IsVisible = true; 396 | 397 | if (animation == null) 398 | { 399 | await Task.FromResult(0); 400 | } 401 | else 402 | { 403 | // the overlay is not passed to the caller 404 | await animation(this); 405 | } 406 | 407 | OnShown(); 408 | } 409 | 410 | 411 | /// 412 | /// Show the popup view. 413 | /// 414 | public void Show() 415 | { 416 | #pragma warning disable 4014 417 | ShowAsync(null); 418 | #pragma warning restore 4014 419 | } 420 | 421 | 422 | /// 423 | /// Hide the popup view. 424 | /// 425 | /// The method is passed the VisualElement that contains the body, header, and footer 426 | /// 427 | /// This method is not limited adding animations. 428 | /// 429 | public async Task HideAsync(Func animation) 430 | { 431 | if (!IsVisible) 432 | { 433 | return; 434 | } 435 | 436 | var handlerResponse = OnHiding(); 437 | 438 | if (handlerResponse.Cancel) 439 | { 440 | return; 441 | } 442 | 443 | if (animation == null) 444 | { 445 | await Task.FromResult(0); 446 | } 447 | else 448 | { 449 | // the overlay is not passed to the caller 450 | await animation(this); 451 | } 452 | 453 | IsVisible = false; 454 | 455 | OnHidden(); 456 | } 457 | 458 | 459 | /// 460 | /// Hide the popup view. 461 | /// 462 | public void Hide() 463 | { 464 | #pragma warning disable 4014 465 | HideAsync(null); 466 | #pragma warning restore 4014 467 | } 468 | 469 | 470 | private void OnPopupInitializing(object sender, EventArgs e) 471 | { 472 | Func factory = delegate 473 | { 474 | var closeOnTap = new TapGestureRecognizer(); 475 | 476 | var cmd = new Command(obj => 477 | { 478 | var view = obj as View; 479 | 480 | if (view == null) 481 | { 482 | return; 483 | } 484 | 485 | var evt = PopupTappedEventArgs.Create(this, view); 486 | 487 | OnPropertyTapped(evt); 488 | }); 489 | 490 | closeOnTap.Command = cmd; 491 | return closeOnTap; 492 | }; 493 | 494 | TapGestureRecognizerVisitor.Visit(_popupView, factory); 495 | } 496 | } 497 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/PopupHidingEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FormsPopup 4 | { 5 | /// 6 | /// Represents the available event data, when the event is invoked. 7 | /// 8 | public class PopupHidingEventArgs : EventArgs 9 | { 10 | /// 11 | /// The event can be stopped, by assigning true to this property. 12 | /// 13 | public bool Cancel { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/PopupPage.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | using System.Collections.Specialized; 3 | using Xamarin.Forms; 4 | 5 | namespace FormsPopup 6 | { 7 | /// 8 | /// One of two methods must be taken to utilize the view. 9 | /// 1) The visible page must inherit from 10 | /// 2) The visible page must instantiate an object of in page's constructor 11 | /// 12 | public abstract class PopupPage : ContentPage 13 | { 14 | private readonly PopupPageInitializer _popupInit; 15 | public ObservableCollection Popups { get; protected set; } 16 | 17 | 18 | protected PopupPage() 19 | { 20 | _popupInit = new PopupPageInitializer(this); 21 | Popups = new ObservableCollection(); 22 | Popups.CollectionChanged += Popups_CollectionChanged; 23 | } 24 | 25 | 26 | private void Popups_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 27 | { 28 | if (e.Action == NotifyCollectionChangedAction.Add) 29 | { 30 | foreach (Popup item in e.NewItems) 31 | { 32 | _popupInit.Add(item); 33 | } 34 | } 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/PopupPageInitializer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using Xamarin.Forms; 5 | 6 | namespace FormsPopup 7 | { 8 | /// 9 | /// Initialize the views that are shown from a 10 | /// 11 | public sealed class PopupPageInitializer : IEnumerable 12 | { 13 | private readonly List _popups = new List(); 14 | private readonly AbsoluteLayout _absContent = new AbsoluteLayout(); 15 | private bool _initialized; 16 | 17 | public ContentPage ParentPage { get; set; } 18 | public IEnumerable Popups => _popups; 19 | 20 | 21 | /// 22 | /// Instantiate 23 | /// 24 | /// The page that contains the views 25 | public PopupPageInitializer(ContentPage parentPage) 26 | { 27 | if (parentPage == null) throw new ArgumentNullException(nameof(parentPage)); 28 | 29 | ParentPage = parentPage; 30 | parentPage.ChildAdded += ParentPage_ChildAdded; 31 | parentPage.Appearing += ParentPage_Appearing; 32 | } 33 | 34 | 35 | /// 36 | /// This method must be called before the property is set. 37 | /// 38 | /// The popup to be initialized 39 | public void Add(Popup popup) 40 | { 41 | if (popup == null) throw new ArgumentNullException(nameof(popup)); 42 | _popups.Add(popup); 43 | } 44 | 45 | 46 | public IEnumerator GetEnumerator() 47 | { 48 | return _popups.GetEnumerator(); 49 | } 50 | 51 | 52 | IEnumerator IEnumerable.GetEnumerator() 53 | { 54 | return GetEnumerator(); 55 | } 56 | 57 | 58 | private void Initialize() 59 | { 60 | if (_initialized) return; 61 | _initialized = true; 62 | 63 | var oldContent = ParentPage.Content; 64 | 65 | Device.OnPlatform(() => ParentPage.Content = null); 66 | 67 | _absContent.Children.Add(oldContent); 68 | 69 | AbsoluteLayout.SetLayoutFlags(oldContent, AbsoluteLayoutFlags.All); 70 | AbsoluteLayout.SetLayoutBounds(oldContent, new Rectangle(0, 0, 1, 1)); 71 | 72 | ParentPage.Content = _absContent; 73 | } 74 | 75 | 76 | private void ParentPage_ChildAdded(object sender, ElementEventArgs e) 77 | { 78 | if (ParentPage is PopupPage) return; 79 | 80 | if (ParentPage.Content == e.Element && e.Element != _absContent) 81 | { 82 | Initialize(); 83 | } 84 | } 85 | 86 | 87 | private void ParentPage_Appearing(object sender, EventArgs e) 88 | { 89 | Initialize(); 90 | 91 | foreach (var popup in Popups) 92 | { 93 | _absContent.Children.Add(popup, new Rectangle(0, 0, 1, 1), AbsoluteLayoutFlags.All); 94 | popup.OnInitializing(); 95 | } 96 | } 97 | } 98 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/PopupSectionType.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FormsPopup 4 | { 5 | /// 6 | /// Used to identify the logical sections of a . 7 | /// 8 | [Flags] 9 | public enum PopupSectionType 10 | { 11 | NotSet, 12 | Border, 13 | Backdrop, 14 | Header, 15 | Body, 16 | Footer 17 | } 18 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/PopupShowingEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace FormsPopup 4 | { 5 | /// 6 | /// Represents the available event data, when the event is invoked. 7 | /// 8 | public class PopupShowingEventArgs : EventArgs 9 | { 10 | /// 11 | /// The event can be stopped, by assigning true to this property. 12 | /// 13 | public bool Cancel { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/PopupTappedEventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xamarin.Forms; 3 | 4 | namespace FormsPopup 5 | { 6 | /// 7 | /// Represents the available event data, when the event is invoked. 8 | /// 9 | public class PopupTappedEventArgs : EventArgs 10 | { 11 | public PopupSectionType Section { get; set; } 12 | public View ControlTapped { get; set; } 13 | public Popup Popup { get; set; } 14 | public bool IsUserControl { get; set; } 15 | 16 | 17 | /// 18 | /// Instantiate a new 19 | /// 20 | /// The popup that was tapped 21 | /// The view that was tapped 22 | /// 23 | public static PopupTappedEventArgs Create(Popup popup, View view) 24 | { 25 | PopupSectionType housingSectionType; 26 | 27 | var parentView = view.FindParent(ve => 28 | { 29 | var parentSectionType = ve.GetValue(Popup.SectionTypeProperty); 30 | var currentSection = (PopupSectionType)parentSectionType; 31 | 32 | return currentSection == PopupSectionType.Body 33 | || currentSection == PopupSectionType.Footer 34 | || currentSection == PopupSectionType.Header; 35 | }); 36 | 37 | 38 | if (parentView == null) 39 | { 40 | housingSectionType = PopupSectionType.Backdrop; 41 | } 42 | else 43 | { 44 | housingSectionType = (PopupSectionType)parentView.GetValue(Popup.SectionTypeProperty); 45 | } 46 | 47 | 48 | var controlType = (PopupSectionType)view.GetValue(Popup.SectionTypeProperty); 49 | var evt = new PopupTappedEventArgs 50 | { 51 | Popup = popup, 52 | ControlTapped = view, 53 | IsUserControl = controlType == PopupSectionType.NotSet, 54 | Section = housingSectionType 55 | }; 56 | 57 | return evt; 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/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("FormsPopup")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("FormsPopup")] 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 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/TapGestureRecognizerVisitor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xamarin.Forms; 3 | 4 | namespace FormsPopup 5 | { 6 | internal static class TapGestureRecognizerVisitor 7 | { 8 | /// 9 | /// Add a GestureRecognizer to the and any children it may contain. 10 | /// 11 | /// The view to add the behavior to. 12 | /// A method that returns a GestureRecognizer 13 | /// 14 | public static void Visit(View view, Func factoryMethod) 15 | { 16 | var behavior = factoryMethod(); 17 | var tapBehavior = behavior as TapGestureRecognizer; 18 | 19 | if (tapBehavior == null) 20 | { 21 | throw new InvalidOperationException("The factoryMethod must return a TapGestureRecognizer"); 22 | } 23 | 24 | tapBehavior.CommandParameter = view; 25 | view.GestureRecognizers.Add(behavior); 26 | VisitChildren(view as ILayoutController, factoryMethod); 27 | } 28 | 29 | 30 | private static void VisitChildren(ILayoutController controller, Func factoryMethod) 31 | { 32 | if (controller == null || controller.Children.Count == 0) 33 | { 34 | return; 35 | } 36 | 37 | foreach (var child in controller.Children) 38 | { 39 | /** 40 | * All controls should get a TapGestureRecognizer, in the event they are touched. 41 | */ 42 | 43 | if (child is ILayoutController) 44 | { 45 | VisitChildren(child as ILayoutController, factoryMethod); 46 | } 47 | 48 | var view = child as View; 49 | if (view == null) 50 | { 51 | return; 52 | } 53 | 54 | if (view is Button) 55 | { 56 | return; 57 | } 58 | 59 | var behavior = factoryMethod(); 60 | var tapBehavior = behavior as TapGestureRecognizer; 61 | 62 | if (tapBehavior != null) 63 | { 64 | tapBehavior.CommandParameter = view; 65 | } 66 | 67 | view.GestureRecognizers.Add(behavior); 68 | } 69 | } 70 | } 71 | } 72 | 73 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/VisualElementExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xamarin.Forms; 3 | 4 | namespace FormsPopup 5 | { 6 | /// 7 | /// VisualElement utility methods 8 | /// 9 | public static class VisualElementExtensions 10 | { 11 | /// 12 | /// Search the element hierarchy for an ancestor of type and return it. 13 | /// 14 | /// The starting location of the search 15 | public static T FindParent(this Element visual) where T : Element 16 | { 17 | var obj = visual; 18 | while ((obj as T) == null) 19 | { 20 | if (obj.Parent == null) 21 | { 22 | return null; 23 | } 24 | 25 | obj = obj.Parent; 26 | } 27 | 28 | return (T)obj; 29 | } 30 | 31 | 32 | /// 33 | /// Search the element hierarchy for a parent that meets the supplied condition. 34 | /// 35 | /// The starting location of the search 36 | /// The condition that is recursively called for each parent view in the hierarchy 37 | /// 38 | public static Element FindParent(this Element visual, Predicate condition) 39 | { 40 | if (visual.Parent == null) 41 | { 42 | return null; 43 | } 44 | 45 | var current = visual.Parent; 46 | 47 | while (current != null) 48 | { 49 | var result = condition(current); 50 | 51 | if (result) 52 | { 53 | return current; 54 | } 55 | 56 | current = current.Parent; 57 | } 58 | 59 | return null; 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /FormsPopup/FormsPopup/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Michael Davis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Xamarin.Forms Popup View 3 | 4 | This repository houses an example of using the Xamarin.Forms API to create a popup view. 5 | I chose not to use any platform APIs (Xamarin.Android or Xamarin.iOS) while implementing the view, as I wished to experiment with the framework. That said, it's still a fairly *featureful* implementation. 6 | 7 | **Projects** 8 | 9 | * FormsPopup (The `Popup` implementation) 10 | * FormsPopup.Examples 11 | * FormsPopup.Droid 12 | * FormsPopup.iOS 13 | 14 | ## A short note ## 15 | 16 | This project has a few documented issues. They are mostly related to iOS9. 17 | 18 | ## Initializing 19 | 20 | The current implementation requires either one of two conditions be met before you can use a popup view within a `Page`: 21 | 22 | 1. The visible page must extend from the `PopupPage` class. 23 | 2. Any visible page that does not extend from `PopupPage` must instantiate an object of type `PopupPageInitializer` after the page's content has been set. This is easier than it seems: 24 | 25 | **Example** 26 | 27 | ```csharp 28 | public class CodedSimpleExample : ContentPage 29 | { 30 | public CodedSimpleExample() 31 | { 32 | var popup = new Popup 33 | { 34 | XPositionRequest = 0.5, 35 | YPositionRequest = 0.2, 36 | ContentHeightRequest = 0.1, 37 | ContentWidthRequest = 0.4, 38 | Padding = 10, 39 | 40 | Body = new ContentView 41 | { 42 | BackgroundColor = Color.White, 43 | Content = new Label 44 | { 45 | XAlign = TextAlignment.Center, 46 | YAlign = TextAlignment.Center, 47 | TextColor = Color.Black, 48 | Text = "Hello, World!" 49 | } 50 | } 51 | }; 52 | 53 | var button = new Button {Text = "Show Popup"}; 54 | button.Clicked += (s, e) => popup.Show(); 55 | 56 | Content = new StackLayout 57 | { 58 | Children = 59 | { 60 | button 61 | } 62 | }; 63 | 64 | // Required for the popup to work. It must come after the Content has been set. 65 | new PopupPageInitializer(this) {popup}; 66 | } 67 | } 68 | ``` 69 | 70 | Two examples have been added to the `FormsPopup.Examples` project to demonstrate this point. Reference either `CodedPopupExample.cs` or `XamlPopupExample.xaml/XamlPopupExample.cs`. 71 | 72 | ## Sizing and Placement 73 | 74 | The current implementation relies heavily on proportional sizes. For any `Popup` properties that require a location or size, you should pass in a value between 0 and 1. 75 | 76 | **Example** 77 | 78 | ```csharp 79 | var popup = new Popup 80 | { 81 | XPositionRequest = 0.5, 82 | YPositionRequest = 0.5, 83 | ContentWidthRequest = 0.8, 84 | ContentHeightRequest = 0.8 85 | }; 86 | ``` 87 | 88 | ## Events 89 | 90 | The following events are invoked during various moments in a popup's life cycle. They're availble to all `Popup` views. 91 | 92 | * Initializing (happens once, during the hosting page's `Appearing` event) 93 | * Tapped 94 | * Showing 95 | * Shown 96 | * Hiding 97 | * Hidden 98 | 99 | The `Tapped`, `Showing`, and `Hiding` events can be cancelled by using the event argument property: 100 | 101 | **Example** 102 | 103 | ```csharp 104 | private void Popup1_Showing(object sender, PopupShowingEventArgs e) 105 | { 106 | if (_preventShowing.On) 107 | { 108 | e.Cancel = true; 109 | } 110 | } 111 | ``` 112 | 113 | ## Animations 114 | 115 | The `Popup.ShowAsync()` and `Popup.HideAsync()` methods can be used to add animations. If you do not wish to include animations, you can use either `Popup.Show()` or `Popup.Hide()`. 116 | 117 | **Example** 118 | 119 | ```csharp 120 | double original; 121 | 122 | await popup.ShowAsync(async p => 123 | { 124 | original = p.Scale; 125 | 126 | await Task.WhenAll 127 | ( 128 | /** 129 | * Since p is the Popup object, scaling it would also affect the overlay 130 | * behind the popup's body. Although it wouldn't be noticeable in this simple example, 131 | * it would be if the overlay's color was set. 132 | **/ 133 | 134 | p.SectionContainer.RelScaleTo(0.05, 100, Easing.CubicOut), 135 | p.SectionContainer.RelScaleTo(-0.05, 105, Easing.CubicOut) 136 | ).ContinueWith(c => 137 | { // reset popup to original size 138 | p.SectionContainer.Scale = original; 139 | }); 140 | }); 141 | ``` 142 | 143 | ## Styling 144 | 145 | At this moment, there are no default styles for the popup. Your views will inherit whatever styles you have attached to your resource dictionaries. 146 | 147 | ## Miscellaneous Features 148 | 149 | * The left, top, right, and bottom border colors can be individually set 150 | * During the `Tapped` event, you can determine if the user tapped within the header, body, or footer sections. 151 | 152 | ## Screenshots 153 | ![alt text](https://github.com/michaeled/FormsPopup/blob/master/pictures/androidPopup.gif "Android") 154 | ![alt text](https://github.com/michaeled/FormsPopup/blob/master/pictures/iOSPopup.gif "iOS") 155 | 156 | 157 | More screenshots are available in the repository. 158 | 159 | ## FAQ 160 | 161 |
162 |
Q. Can I use XAML to create popup views?
163 |
A. Of course!
164 | 165 |
Q. Can I add control XX in the popup?
166 |
A. I don't see why not. Let me know if you have any problems.
167 |
168 | -------------------------------------------------------------------------------- /pictures/androidPopup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/pictures/androidPopup.gif -------------------------------------------------------------------------------- /pictures/gridlayout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/pictures/gridlayout.png -------------------------------------------------------------------------------- /pictures/iOSPopup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michaeled/FormsPopup/cf64b996d9ae820a6666ff8b55fb2d00a6696512/pictures/iOSPopup.gif --------------------------------------------------------------------------------